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, h
You need to use @avg.floatValue
(or @avg.doubleValue
, or what have you). The @avg
operator 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:
to get the values specified by the property specified by the key path to the right of the operator
Is saying. Since you have a collection of NSNumber
objects, you use one of the *value
accessors, e.g. floatValue
to get the value of each object. As an example:
#include
int main(void) {
NSMutableArray *ma = [NSMutableArray array];
[ma addObject:[NSNumber numberWithFloat:1.0]];
[ma addObject:[NSNumber numberWithFloat:2.0]];
[ma addObject:[NSNumber numberWithFloat:3.0]];
NSLog(@"avg = %@", [ma valueForKeyPath:@"@avg.floatValue"]);
return 0;
}
Compiling and running this code returns:
$ clang avg.m -framework Foundation -o avg
steve:~/code/tmp
$ ./avg
2013-01-18 12:33:15.500 avg[32190:707] avg = 2
steve:~/code/tmp
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, @avg
will 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 NSNumber
objects, @avg.self
works just fine.