gpt4 book ai didi

cocoa - 矩阵乘法给出错误的结果

转载 作者:行者123 更新时间:2023-12-03 17:48:38 26 4
gpt4 key购买 nike

我尝试制定一种方法来计算两个矩阵之间的乘法,但结果有问题。有些线计算得很好,但另一些则不然。当我多次运行该程序时,这些行的结果会发生变化。

更新 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|

最佳答案

因为您在 matrix2MultMatrix1:byMatrix2: 方法中声明 float mat[16],一旦您离开该方法,mat 指向的内存(和结果)保留在堆栈上以供其他使用。

您想要做的是在此方法中显式分配一些内存,这样一旦返回它就不会被覆盖。

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

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

free(matResult);

关于cocoa - 矩阵乘法给出错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37149199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com