矩阵乘法给出错误的结果

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);