目标C - 矩阵乘法慢性能

时间:2012-05-22 05:07:58

标签: objective-c matrix nsmutablearray multiplication matrix-multiplication

我有2个2-D NSMutableArrays,我正在尝试做一些基本的矩阵乘法。我的通用公式代码如下,但其性能异常缓慢(正如预期的那样)。我已经做了很多谷歌搜索,并没有找到任何简单易懂的公式来改变性能增强的代码。任何人都可以指出一个简单的公式/教程/示例的正确方向,如何在目标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;
}

2 个答案:

答案 0 :(得分:8)

如果你用C 写它会更快。


对于此任务,与double[] NSArray相比,

NSNumber会非常快。您将拥有良好的缓存一致性,最少的指令,无需通过运行时或分配以便编写或读取元素。无需对每个元素执行引用计数循环...

答案 1 :(得分:4)

您需要查看 ios4.0以后的 Apple加速框架 。 您可以使用它进行大量复杂的数学和矩阵操作,并且优化该框架以在任何iOS硬件上运行。

结帐:

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