0

さて、私はすべてのObjective Cで動作するコードを記述しました(はい、objcは技術的にはCだけです。しかし、メッセージなどを使用して記述しました。Javaのバックグラウンドしかなく、昔ながらのことについてはあまり知りません。 C)しかし、それは信じられないほど遅く実行されました。だから私は(私が思った)同じコードを書きましたが、今ではこのループのセットは(いくつかの数値に対してのみ)異なる値を生成し、私は一生の間、何が違うのか理解できません。私がしているのは、10回ループし、行列間で1回の乗算と1回の加算を行うことです。2つの言語に精通している人が、私が間違って書き起こしたコードの部分を見つけてくれることを願っています。どの配列についても事前に何も変更しなかったため(ハードコードされていて影響を受けていない)、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

これは古いObjcコードでした:

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

1 に答える 1

0

この問題は、以前のメモリ管理の問題と関係があり、一部の計算で0が使用されていました。

于 2012-08-07T20:26:20.120 に答える