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ができます:
正しい結果がでなければなりません:
| 110 34 98 36|
| 46 85 14 56|
| 96 12 78 44|
| 39 6 21 25|
なお、あなたはマット 'の式を持っている方法[0] 'mat '[15]'が完全に書かれていても、コードが正しいかどうかを一目で分かりやすくすることや、異なるサイズの行列で動作するように修正することは非常に困難です。代わりに2つまたは3つのネストされた 'for'ループを使用することを検討してください。 –