2

2つの2次元NSMutableArrayがあり、基本的な行列の乗算を実行しようとしています。以下に一般的な数式コードがありますが、そのパフォーマンスは非常に遅いです(予想どおり)。私はたくさんのグーグルをしましたが、パフォーマンスを向上させるためにコードを変更するための簡単でも理解しやすい式も見つかりませんでした。Objective Cの行列乗算で0(n ^ 3)よりも優れたパフォーマンスを得る方法の簡単な式/チュートリアル/例の正しい方向に誰かが私を向けることができますか?

+ (NSMutableArray*)multiply:(NSMutableArray*)a1 withArray:(NSMutableArray*)a2
{
    if([[a1 objectAtIndex: 0] count] != [a2 count])
    {
        NSLog(@"Multiplicaton error!");
        return NULL;
    }

    int a1_rowNum = [a1 count];
    int a2_rowNum = [a2 count];
    int a2_colNum = [[a2 objectAtIndex:0] count];
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:a1_rowNum];
    for (int i = 0; i < a1_rowNum; i++) {
        NSMutableArray *tempRow = [NSMutableArray arrayWithCapacity:a2_colNum];
        for (int j = 0; j < a2_colNum; j++) {
            double tempTotal = 0;
            for (int k = 0; k < a2_rowNum; k++) {
                double temp1 = [[[a1 objectAtIndex:i] objectAtIndex:k] doubleValue];
                double temp2 = [[[a2 objectAtIndex:k] objectAtIndex:j] doubleValue];
                tempTotal += temp1 * temp2;
            }
             //Stored as a string because I upload it to an online database for storage.
            [tempRow addObject:[NSString stringWithFormat:@"%f",tempTotal]];
        }
        [result addObject:tempRow];
    }
    return result;
}
4

2 に答える 2

8

Cで書くと、はるかに高速になります。


double[]このタスクのsにNSArray比べて途方もなく高速になります。NSNumber優れたキャッシュコヒーレンシ、最小限の命令があり、要素の書き込みまたは読み取りのためにランタイムを通過したり、割り当てたりする必要はありません。各要素で参照カウントサイクリングを実行する必要はありません…</p>

于 2012-05-22T05:15:18.107 に答える
4

ios4.0以降AppleのAccelerateframeWorkを確認する必要があります。これを使用して多くの複雑な数学と行列の操作を行うことができ、このフレームワークは任意のiOSハードウェアで実行するように最適化されています。

チェックアウト:

https://developer.apple.com/performance/accelerateframework.html

于 2012-05-22T05:16:35.873 に答える