【发布时间】:2020-11-03 06:48:18
【问题描述】:
在自学 c 时,我认为编写一个将两个 3x3 矩阵相乘然后使其更通用的函数是一个好习惯。该函数似乎计算了第一列和最后一列的正确结果,但不是中间列。此外,中间列下方的每个值都比上一个值多 3。
例如:
[1 2 3] [23 4 6]
[4 5 6] * [ 2 35 0]
[7 8 9] [14 2 43]
我收到的答案是:
[ 69 80 135]
[190 273 282]
[303 326 429]
实际答案应该是:
[ 69 83 135]
[190 279 282]
[303 335 429]
为了清楚起见,将中间的列分开:
Received Expected
[ 80] [ 83]
[273] [279]
[326] [335]
我的代码如下:
#include <stdio.h>
typedef struct mat_3x3
{
double values [3][3];
} mat_3x3;
void SetMatrix(mat_3x3 * matrix, double vals[3][3])
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
(matrix->values)[i][j] = vals[i][j];
}
}
putchar('\n');
}
mat_3x3 MatrixMultiply(mat_3x3 * m1, mat_3x3 * m2)
{
mat_3x3 result;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
double temp = 0;
for (int k = 0; k < 3; k++)
{
temp += ((m1->values)[i][k] * (m2->values)[k][j]);
}
(result.values)[i][j] = temp;
}
}
return result;
}
void PrintMatrix(mat_3x3 * matrix)
{
putchar('\n');
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%lf ", (matrix->values)[i][j]);
}
putchar('\n');
}
putchar('\n');
}
int main()
{
mat_3x3 m1;
mat_3x3 * pm1 = &m1;
mat_3x3 m2;
mat_3x3 * pm2 = &m2;
double vals[3][3] = {
{1,2,3},
{4,7,6},
{7,8,9}
};
double vals2[3][3] = {
{23,4,6},
{2,35,0},
{14,2,43}
};
SetMatrix(pm1, vals);
SetMatrix(pm2, vals2);
printf("\nm1:");
PrintMatrix(pm1);
printf("\nm2:");
PrintMatrix(pm2);
mat_3x3 m3 = MatrixMultiply(pm1, pm2);
mat_3x3 * pm3 = &m3;
printf("\nm3 = m1 * m2");
PrintMatrix(pm3);
}
已经研究了一段时间,现在将其与其他简单示例进行比较,但找不到问题,因此不胜感激!
此外,如果我在语法方面做了任何糟糕的事情等,我也愿意接受任何关于它的编写方式的批评。
【问题讨论】:
-
不要从纯数学函数中打印。使用 memcpy 传输矩阵数据。
-
我没有看到代码有问题。你认为你应该得到的答案是错误的。它实际上给出的答案是我从手工中得到的。
-
关闭 3,关闭 6,关闭 9。嗯 - 与第一个矩阵的第三列保持相同的值。听起来对我来说是一个错过的补充。每次的结果都是 MatrixA.colum3 太小了。
-
PrintMatrix(pm4) 是未命中类型,现已更正。
-
感谢您的帮助,我想我已经找到了问题所在。尝试了一个不同的在线计算器来检查答案,这次它匹配得很好。
标签: c