5

目前我正在尝试找到一种紧凑的方法来平均一个 matrix。显而易见的解决方案是对矩阵求和,然后除以元素的数量。然而,我在苹果开发者网站上发现了一种方法,声称这可以使用 valueForKeyPath 以更简单的方式完成。这是链接在这里:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html

这是我目前正在尝试使其正常工作的示例:

-(void)arrayAverager
{
   NSMutableArray *myArray = [NSMutableArray arrayWithCapacity:25];
   [myArray addObject:[NSNumber numberWithInteger:myValue]];
   NSNumber *averageValue = [myArray valueForKeyPath:@"@avg.self"];
   NSLog(@"avg  = %@", averageValue);

} 

问题是:它不是对数组进行平均,而是将数组中的元素 1 逐 1 打印出来。

更新

-(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"]);
 }
4

2 回答 2

18

你需要使用@avg.floatValue(或@avg.doubleValue,或你有什么)。运算符将@avg平均由点后面的名称指定的数组中对象的属性。文档在这一点上令人困惑,但这就是:

获取运算符右侧键路径指定的属性指定的值

正在说。由于您有一组NSNumber对象,因此您可以使用其中一个*value访问器,例如floatValue获取每个对象的值。举个例子:

#include <Foundation/Foundation.h>

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;
}

编译并运行此代码返回:

$ 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

这种方法的好处是,只要所有对象都响应指定的方法,这对任何集合(同质的或其他的)@avg都有效。

编辑

正如评论中所指出的,OP 的问题是他用一个元素对集合进行平均,因此它似乎只是打印集合的内容。对于NSNumber对象的集合,@avg.self工作得很好。

于 2013-01-18T12:33:50.107 回答
-1

不,你不能这样做。对象Transaction是一个Modal Class。这class具有三个属性,即

  • 收款人
  • 数量
  • 日期

此图像中的每个row代表一个Transaction modal object

在此处输入图像描述

transactions是一个array包含所有这些行的 ( Transaction Modal Objects)。

在这些transactions数组中,他们尝试使用 operator 计算Transaction Modal 金额字段平均值@avg。所以,就像

NSNumber *transactionAverage = [transactions valueForKeyPath:@"@avg.amount"];

你的数组没有 key self。所以这就是问题所在

于 2013-01-18T12:34:41.187 回答