如何用C中的矩阵乘以矩阵?为什么';这不管用吗?
这是我正在做的节目。任务是将两个矩阵相乘。矩阵A中的列数与矩阵B中的行数相同。下面是对两个矩阵包含的内容以及预期结果的评论。计算结果就是我的程序所做的如何用C中的矩阵乘以矩阵?为什么';这不管用吗?,c,arrays,matrix,multiplication,C,Arrays,Matrix,Multiplication,这是我正在做的节目。任务是将两个矩阵相乘。矩阵A中的列数与矩阵B中的行数相同。下面是对两个矩阵包含的内容以及预期结果的评论。计算结果就是我的程序所做的 void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C){ int k; int l; int j; for(j=0; j < ARows; j++) { for (l=0; l < BCols; l++) {
void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C){
int k;
int l;
int j;
for(j=0; j < ARows; j++) {
for (l=0; l < BCols; l++) {
for (k=0; k < ACols; k++) {
C[j][l] += A[j][k] * B[k][l];
}/*for*/
}/*for*/
}/*for*/
}/*matrixMul*/
/*This is what the output should be....
==> Computing 0.0 1.0 2.0 0.0 1.0 2.0
1.0 2.0 3.0 * 3.0 4.0 5.0
2.0 3.0 4.0 6.0 7.0 8.0
==> Expected 15.0 18.0 21.0
24.0 30.0 36.0
33.0 42.0 51.0
==> Computed 15.0 20.0 25.0
28.0 36.0 44.0
41.0 52.0 63.0 */
void matrixMul(矩阵A、矩阵B、int ARows、int ACols、int BCols、矩阵C){
int k;
int l;
int j;
对于(j=0;j计算0.0 1.0 2.0 0 0.0 1.0 2.0
1.0 2.0 3.0 * 3.0 4.0 5.0
2.0 3.0 4.0 6.0 7.0 8.0
==>预期为15.0 18.0 21.0
24.0 30.0 36.0
33.0 42.0 51.0
==>计算15.0 20.0 25.0
28.0 36.0 44.0
41.0 52.0 63.0 */
你的方程式看起来不错。我只能猜测C
在计算之前没有初始化为全零。我会这样做(只是为了确定):
(j=0;j{
对于(l=0;l C[j][l]=0;//你的方程看起来不错。我只能猜测,C
在计算之前没有初始化为全零。我会这样做(只是为了确保):
(j=0;j{
对于(l=0;l C[j][l]=0;//当矩阵C为零时,代码正常工作:
#include <stdio.h>
typedef double Matrix[3][3];
static void print_matrix(const char *tag, Matrix M);
static void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C);
void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C)
{
int k;
int l;
int j;
for (j = 0; j < ARows; j++)
{
for (l = 0; l < BCols; l++)
{
for (k = 0; k < ACols; k++)
{
C[j][l] += A[j][k] * B[k][l];
}
}
}
}
int main(void)
{
Matrix A = { { 0.0, 1.0, 2.0 }, { 1.0, 2.0, 3.0 }, { 2.0, 3.0, 4.0 }, };
Matrix B = { { 0.0, 1.0, 2.0 }, { 3.0, 4.0, 5.0 }, { 6.0, 7.0, 8.0 }, };
Matrix C = { { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 }, };
print_matrix("A", A);
print_matrix("B", B);
matrixMul(A, B, 3, 3, 3, C);
print_matrix("C", C);
return 0;
}
static void print_matrix(const char *tag, Matrix M)
{
printf("%s:\n", tag);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
printf("%6.2f", M[i][j]);
putchar('\n');
}
}
您可以轻松地修复乘法函数中的代码,从而使结果矩阵的初始内容无关紧要:
void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C)
{
for (int j = 0; j < ARows; j++)
{
for (int l = 0; l < BCols; l++)
{
int sum = 0;
for (int k = 0; k < ACols; k++)
sum += A[j][k] * B[k][l];
C[j][l] = sum;
}
}
}
void matrixMul(矩阵A、矩阵B、int ARows、int ACols、int BCols、矩阵C)
{
对于(int j=0;j
一个好的优化编译器很有可能生成与本版本基本相同的代码,而C[j][l]
未在最内层循环中使用。当矩阵C为零时,您的代码工作正常:
#include <stdio.h>
typedef double Matrix[3][3];
static void print_matrix(const char *tag, Matrix M);
static void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C);
void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C)
{
int k;
int l;
int j;
for (j = 0; j < ARows; j++)
{
for (l = 0; l < BCols; l++)
{
for (k = 0; k < ACols; k++)
{
C[j][l] += A[j][k] * B[k][l];
}
}
}
}
int main(void)
{
Matrix A = { { 0.0, 1.0, 2.0 }, { 1.0, 2.0, 3.0 }, { 2.0, 3.0, 4.0 }, };
Matrix B = { { 0.0, 1.0, 2.0 }, { 3.0, 4.0, 5.0 }, { 6.0, 7.0, 8.0 }, };
Matrix C = { { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 }, };
print_matrix("A", A);
print_matrix("B", B);
matrixMul(A, B, 3, 3, 3, C);
print_matrix("C", C);
return 0;
}
static void print_matrix(const char *tag, Matrix M)
{
printf("%s:\n", tag);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
printf("%6.2f", M[i][j]);
putchar('\n');
}
}
您可以轻松地修复乘法函数中的代码,从而使结果矩阵的初始内容无关紧要:
void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C)
{
for (int j = 0; j < ARows; j++)
{
for (int l = 0; l < BCols; l++)
{
int sum = 0;
for (int k = 0; k < ACols; k++)
sum += A[j][k] * B[k][l];
C[j][l] = sum;
}
}
}
void matrixMul(矩阵A、矩阵B、int ARows、int ACols、int BCols、矩阵C)
{
对于(int j=0;j
一个好的优化编译器很有可能生成与本版本中使用C[j][l]时基本相同的代码
不在最里面的循环中使用。欢迎使用堆栈溢出。请尽快阅读本页。矩阵的类型是什么?
能否显示打印出两个矩阵的代码?在开始添加矩阵之前,是否将矩阵C设置为零?请查看如何创建MCVE()或SSCCE()-两个名称和链接代表相同的基本理念。在中间的循环中,您是否尝试添加c[l][k]=0
,在最里面的循环开始之前。然后会发生什么?而且,似乎你在矩阵中玩的不是整数,也请详细说明这一点。@nIcEcOw:我认为添加C[j][l是正确的=0;
在第三个嵌套循环之前。欢迎使用堆栈溢出。请尽快阅读此页。矩阵的类型是什么?
?能否显示打印出两个矩阵的代码?在开始添加之前是否将矩阵C设置为零?请查看如何创建MCVE()或SSCCE()-两个名称和链接代表相同的基本理念。在中间的循环中,您是否尝试添加c[l][k]=0
,在最里面的循环开始之前。然后会发生什么?而且,似乎你在矩阵中玩的不是整数,也请详细说明这一点。@nIcEcOw:我认为在第三个嵌套循环之前添加C[j][l]=0;
是正确的。