Currently I’m trying to find a compact way to average a matrix. The obvious solution is to sum the matrix, then divide by the number of elements. I have, however, come across a method on the apple developer website that claims this can be done in a simpler way using valueForKeyPath. This is linked here:
Here is the example I’m currently working on to try and get it to work:
-(void)arrayAverager
{
NSMutableArray *myArray = [NSMutableArray arrayWithCapacity:25];
[myArray addObject:[NSNumber numberWithInteger:myValue]];
NSNumber *averageValue = [myArray valueForKeyPath:@"@avg.self"];
NSLog(@"avg = %@", averageValue);
}
The problem is: instead of averaging the array it merely prints out the elements in the array 1 by 1.
UPDATE
-(void) pixelAverager
{
//Put x-coordinate value of all wanted pixels into an array
NSMutableArray *xCoordinateArray = [NSMutableArray arrayWithCapacity:25];
[xCoordinateArray addObject:[NSNumber numberWithInteger:xCoordinate]];
NSLog(@"avg = %@", [xCoordinateArray valueForKeyPath:@"@avg.intValue"]);
}
You need to use
@avg.floatValue(or@avg.doubleValue, or what have you). The@avgoperator will average the property of the objects in the array specified by the name after the dot. The documentation is confusing on this point, but that is what:Is saying. Since you have a collection of
NSNumberobjects, you use one of the*valueaccessors, e.g.floatValueto get the value of each object. As an example:Compiling and running this code returns:
The nice thing about this approach is that this work for any collection, homogenous or otherwise, as long as all objects respond to the specified method,
@avgwill work.EDIT
As pointed in the comments, the OP’s problem is that he is averaging a collection with one element, and thus it appears to simply print the contents of the collection. For a collection of
NSNumberobjects,@avg.selfworks just fine.