矩阵乘法方法给出了错误的结果

时间:2016-05-10 21:22:09

标签: cocoa matrix-multiplication

我尝试制作一种方法来计算两个矩阵之间的乘法,但是我的结果有问题。有些线很好计算,但其他线没有。当我多次运行程序时,这些行的结果会发生变化。

UPDATE 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|

1 个答案:

答案 0 :(得分:1)

由于您在float mat[16]方法中声明了matrix2MultMatrix1:byMatrix2:,因此一旦您离开该方法,mat(和result)指向的内存就会被遗忘在堆栈上供其他用途。

您要做的是在此方法中明确分配一些内存,以便在返回后不会被覆盖。

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

但是每当你分配内存时,你必须确保你释放它,所以一旦你完成了结果:

free(matResult);