2016-05-10 20 views
0

2つの行列間の乗算を計算する方法を試していますが、結果に問題があります。いくつかの線はよく計算されるが、他の線は計算されない。そして、プログラムを何度か実行すると、結果はこれらの行に変わります。行列の乗算方法が間違った結果を返します

更新日12/05/2016:ソリューションでコードを更新しました。ここで

は私の行列の宣言である:ここで

float mat1[16]; 

mat1[0] = 8.0; mat1[1] = 2.0; mat1[2] = 7.0; mat1[3] = 0.0; 
mat1[4] = 2.0; mat1[5] = 9.0; mat1[6] = 0.0; mat1[7] = 4.0; 
mat1[8] = 6.0; mat1[9] = 0.0; mat1[10] = 6.0; mat1[11] = 4.0; 
mat1[12] = 3.0; mat1[13] = 0.0; mat1[14] = 0.0; mat1[15] = 5.0; 

NSLog(@"mat1 ="); 

for (int i = 0; i < 4; i++) 
{ 
    NSLog(@"%f | %f | %f | %f", mat1[(i*4)+0], mat1[(i*4)+1], mat1[(i*4)+2], mat1[(i*4)+3]); 
} 

float *matResult = [self matrix2MultMatrix1:mat1 byMatrix2:mat1]; 

NSLog(@"matResult ="); 

for (int i = 0; i < 4; i++) 
{ 
    NSLog(@"%f | %f | %f | %f", matResult[(i*4)+0], matResult[(i*4)+1], matResult[(i*4)+2], matResult[(i*4)+3]); 
} 

free(matResult); 

は私の方法である:

- (float*)matrix2MultMatrix1:(float*)m1 byMatrix2:(float*)m2 
{ 
    //BEFORE SOLUTION : 
    //float result[16]; 

    //AFTER SOLUTION : 
    float *result = (float*)malloc(16 * sizeof(float)); 

    // First line 
    result[0] = m1[0]*m2[0] + m1[1]*m2[4] + m1[2]*m2[8] + m1[3]*m2[12]; 
    result[1] = m1[0]*m2[1] + m1[1]*m2[5] + m1[2]*m2[9] + m1[3]*m2[13]; 
    result[2] = m1[0]*m2[2] + m1[1]*m2[6] + m1[2]*m2[10] + m1[3]*m2[14]; 
    result[3] = m1[0]*m2[3] + m1[1]*m2[7] + m1[2]*m2[11] + m1[3]*m2[15]; 

    // Second line 
    result[4] = m1[4]*m2[0] + m1[5]*m2[4] + m1[6]*m2[8] + m1[7]*m2[12]; 
    result[5] = m1[4]*m2[1] + m1[5]*m2[5] + m1[6]*m2[9] + m1[7]*m2[13]; 
    result[6] = m1[4]*m2[2] + m1[5]*m2[6] + m1[6]*m2[10] + m1[7]*m2[14]; 
    result[7] = m1[4]*m2[3] + m1[5]*m2[7] + m1[6]*m2[11] + m1[7]*m2[15]; 

    // Third line 
    result[8] = m1[8]*m2[0] + m1[9]*m2[4] + m1[10]*m2[8] + m1[11]*m2[12]; 
    result[9] = m1[8]*m2[1] + m1[9]*m2[5] + m1[10]*m2[9] + m1[11]*m2[13]; 
    result[10] = m1[8]*m2[2] + m1[9]*m2[6] + m1[10]*m2[10] + m1[11]*m2[14]; 
    result[11] = m1[8]*m2[3] + m1[9]*m2[7] + m1[10]*m2[11] + m1[11]*m2[15]; 

    // Fourth line 
    result[12] = m1[12]*m2[0] + m1[13]*m2[4] + m1[14]*m2[8] + m1[15]*m2[12]; 
    result[13] = m1[12]*m2[1] + m1[13]*m2[5] + m1[14]*m2[9] + m1[15]*m2[13]; 
    result[14] = m1[12]*m2[2] + m1[13]*m2[6] + m1[14]*m2[10] + m1[15]*m2[14]; 
    result[15] = m1[12]*m2[3] + m1[13]*m2[7] + m1[14]*m2[11] + m1[15]*m2[15]; 

    return result; 
} 

Xcodeができます:

enter image description here

正しい結果がでなければなりません:

| 110 34 98 36| 
| 46 85 14 56| 
| 96 12 78 44| 
| 39 6 21 25| 
+0

なお、あなたはマット 'の式を持っている方法[0] 'mat '[15]'が完全に書かれていても、コードが正しいかどうかを一目で分かりやすくすることや、異なるサイズの行列で動作するように修正することは非常に困難です。代わりに2つまたは3つのネストされた 'for'ループを使用することを検討してください。 –

答えて

1

あなたがメソッドを離れると、あなたは、matrix2MultMatrix1:byMatrix2:メソッド内float mat[16]を宣言しているので、メモリはmat(およびresult)で指さは、他の使用のためにスタック上に残されています。

このメソッドで明示的にメモリを割り当てると、返すと上書きされません。

float *mat = (float *)malloc(16 * sizeof(float)); 

しかし、あなたはメモリを割り当てるたび、あなたはその結果に終わったかつてので、あなたは、それを解放することを確認する必要があります。

free(matResult); 
+0

その最初の行の行は無効であり、コンパイルされません。複数の方法で修正するには、目的のものを選択して回答を編集する必要があります。 – CRD

+0

固定、ありがとう。 – DanielGibbs

+0

DanielGibbsありがとう!できます !しかし、あなたの答えに直接関係する別の質問があります。私はどこで記憶を解放しなければならないのですか? 'result'の前に解放すれば値は失われ、' result'の後に解放すれば、free()命令の前に関数が終了するので、本当に解放があるかどうかわかりません。 –

関連する問題