Objective c 将目标C转换为C矩阵操作

Objective c 将目标C转换为C矩阵操作,objective-c,c,xcode,matrix,matrix-multiplication,Objective C,C,Xcode,Matrix,Matrix Multiplication,好的,所以我用所有的objective c编写了工作代码(是的,我知道objc在技术上只是c。但我的意思是我用消息和东西编写了它。我只有java背景,对普通的旧c不太了解),但它运行得非常慢。所以我写下了(我认为)相同的代码,但现在这组循环产生了不同的值(只对一些数字),我不能,就我的一生而言,找出什么是不同的。我正在做的是循环10次,在矩阵之间做1次乘法和1次加法。我希望对这两种语言有更多背景的人能找出我转录错误的部分代码。我事先没有对任何数组进行任何更改(这些数组是硬编码的,没有效果),因此

好的,所以我用所有的objective c编写了工作代码(是的,我知道objc在技术上只是c。但我的意思是我用消息和东西编写了它。我只有java背景,对普通的旧c不太了解),但它运行得非常慢。所以我写下了(我认为)相同的代码,但现在这组循环产生了不同的值(只对一些数字),我不能,就我的一生而言,找出什么是不同的。我正在做的是循环10次,在矩阵之间做1次乘法和1次加法。我希望对这两种语言有更多背景的人能找出我转录错误的部分代码。我事先没有对任何数组进行任何更改(这些数组是硬编码的,没有效果),因此A1、A2等在代码的两部分中具有相同的值

C中的当前代码:

    for (int m = 0; m < 10; m++) {

    //Do matrix multiplication between A1 and A2.  Store in temporary B1
    for( int i = 0; i < 13; i++ )
        for( int j = 0; j < 43; j++ ) {
            double tempTotal = 0;
            for( int k = 0; k < 43; k++){
                tempTotal = tempTotal + A1[i][k] * A2[k][j];
            }
            B1[i][j] = tempTotal;
        }

    //Assign B1 data back into A1 after the multiplication is finished
    for(int i = 0; i < 13; i++)
        for(int j = 0; j<43; j++)
            A1[i][j] = B1[i][j];

    //Add C1 and A1.  Store into C1.
    for (int l = 0; l < 13; l++) 
        for (int n = 0; n < 43; n++) 
            C1[l][n] = C1[l][n] + A1[l][n];

}//end m for loop
for(int m=0;m<10;m++){
//在A1和A2之间进行矩阵乘法。存储在临时B1中
对于(int i=0;i<13;i++)
对于(int j=0;j<43;j++){
双总=0;
对于(int k=0;k<43;k++){
TENTOTAL=TENTOTAL+A1[i][k]*A2[k][j];
}
B1[i][j]=总计;
}
//乘法完成后,将B1数据分配回A1
对于(int i=0;i<13;i++)

对于(int j=0;j此问题与以前的内存管理问题有关,导致在某些计算中使用0。

您的加法和乘法代码看起来都正确。检查您的分配,验证是否清除了数组,并通过valgrind运行它以检查细微的内存错误。让陌生人通过inspec发现代码中的错误调试无效。应使用调试器(或打印语句)要确定代码行为的差异,请使用一个小的简单数据集进行测试。xcode是否有调试器,如果有,我该如何使用它?我已经记录了许多地方,并使用它运行了大量测试,但仍然没有成功。您应该检查哪些代码生成正确的结果(只有一个是正确的)。然后尝试在错误代码中查找错误。如果您不想手动检查,有许多工具可用于矩阵乘法,例如GSL库的部分。与其尝试编写自己的矩阵乘法例程,不如链接加速框架并调用
cblas_dgemm
 for (int m = 0; m < 10; m++) {
    //multiply A1 and A2.  Store into A1
    A1 = [LCA_Computation multiply:A1 withArray:A2];    //LCA_Computation is the name of the .m class file in which this all happens.  

    //Add C1 and A1.  Store into C1
    for (int i = 0; i < 13; i++) 
        for (int j = 0; j < 43; j++) 
            [[C1 objectAtIndex:i] replaceObjectAtIndex:j withObject:[NSNumber numberWithDouble: [[[C1 objectAtIndex: i] objectAtIndex: j] doubleValue] + [[[A1 objectAtIndex: i] objectAtIndex: j] doubleValue]]];

}//end m for loop

//multiply method
   + (NSMutableArray*)multiply:(NSMutableArray*)a1 withArray:(NSMutableArray*)a2
{
    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;
            }
            //the String format is intentional.  I convert them all to strings later.  I just put it in the method here where as it is done later in the C code
            [tempRow addObject:[NSString stringWithFormat:@"%f",tempTotal]];
        }
        [result addObject:tempRow];
    }
    return result;
}