矩阵乘法给出错误的结果
Matrix multiplication method gives wrong result
我尝试制作一种方法来计算两个矩阵之间的乘法,但结果有问题。有些线计算得很好,但其他线没有。当我多次 运行 程序时,这些行的结果会发生变化。
更新 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|
因为您在 matrix2MultMatrix1:byMatrix2:
方法中声明了 float mat[16]
,一旦您离开该方法,mat
(和 result
)指向的内存将被保留在堆栈上以供其他用途。
你想要做的是在这个方法中显式分配一些内存,这样一旦你 return 它就不会被覆盖。
float *mat = (float *)malloc(16 * sizeof(float));
但是无论何时分配内存,都必须确保释放它,所以一旦完成结果:
free(matResult);
我尝试制作一种方法来计算两个矩阵之间的乘法,但结果有问题。有些线计算得很好,但其他线没有。当我多次 运行 程序时,这些行的结果会发生变化。
更新 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|
因为您在 matrix2MultMatrix1:byMatrix2:
方法中声明了 float mat[16]
,一旦您离开该方法,mat
(和 result
)指向的内存将被保留在堆栈上以供其他用途。
你想要做的是在这个方法中显式分配一些内存,这样一旦你 return 它就不会被覆盖。
float *mat = (float *)malloc(16 * sizeof(float));
但是无论何时分配内存,都必须确保释放它,所以一旦完成结果:
free(matResult);