5

現在、マトリックスを平均化するコンパクトな方法を見つけようとしています。明らかな解決策は、行列を合計してから、要素の数で割ることです。ただし、Apple 開発者の Web サイトで、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 つずつ出力するだけです。

アップデート

-(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アクセサの 1 つを使用して、たとえば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の問題は、コレクションを1つの要素で平均化しているため、コレクションの内容を単純に出力しているように見えることです。NSNumberオブジェクトのコレクションの場合、@avg.self問題なく機能します。

于 2013-01-18T12:33:50.107 に答える
-1

いいえ、あなたはこのようにすることはできません。オブジェクトTransactionModal Class. これclassには、次の 3 つのプロパティがあります。

  • 受取人
  • 日にち

rowこの画像のそれぞれが 1 つを表していTransaction modal objectます。

ここに画像の説明を入力

transactionsは、arrayこれらすべての行を保持する です ( Transaction Modal Objects)。

これらのtransactions配列では、 operator を使用してTransaction Modal 金額フィールドの平均を計算しようとしています@avg。だから、そのような

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

あなたの配列にはキーがありませんself。それが問題です

于 2013-01-18T12:34:41.187 に答える