矩阵与**指针相乘,输出错误 intmain() { int n=0; int i=0; int j=0; int k=0; 整数**x; 国际**y; int**z; printf(“输入矩阵大小-(N x N):”; scanf(“%d”和“&n”); x=malloc(n*sizeof(int*); y=malloc(n*sizeof(int*); z=malloc(n*sizeof(int*); 对于(i=0;i
所以我试着做一个矩阵乘法,其中两个矩阵总是2x2或3x3,等等。我想用随机值填充这两个矩阵,然后做一个乘法。我的问题是,存储答案的第三个矩阵产生了错误的值。例如,我的前两个矩阵(对于2x2)包含值[4,7,4,6]和[8,6,7,3],我的输出是[76,48,70,45],而实际上应该是[81,45,74,42]。不知道出了什么问题?当您使用矩阵与**指针相乘,输出错误 intmain() { int n=0; int i=0; int j=0; int k=0; 整数**x; 国际**y; int**z; printf(“输入矩阵大小-(N x N):”; scanf(“%d”和“&n”); x=malloc(n*sizeof(int*); y=malloc(n*sizeof(int*); z=malloc(n*sizeof(int*); 对于(i=0;i,c,matrix,C,Matrix,所以我试着做一个矩阵乘法,其中两个矩阵总是2x2或3x3,等等。我想用随机值填充这两个矩阵,然后做一个乘法。我的问题是,存储答案的第三个矩阵产生了错误的值。例如,我的前两个矩阵(对于2x2)包含值[4,7,4,6]和[8,6,7,3],我的输出是[76,48,70,45],而实际上应该是[81,45,74,42]。不知道出了什么问题?当您使用malloc()分配内存时,您得到的空间不会自动初始化。它可以包含任何值。用随机值填充x和y矩阵,但使用z的元素就像它们来自malloc()一样。您希望在乘
malloc()
分配内存时,您得到的空间不会自动初始化。它可以包含任何值。用随机值填充x
和y
矩阵,但使用z
的元素就像它们来自malloc()
一样。您希望在乘法的主要部分之前将它们设置为零。您可以首先使用calloc()
分配它们,也可以在设置初始x
和y
值的同一循环嵌套中将它们设置为零。当您使用malloc()
分配内存时,您得到的空间不会自动初始化。它可以包含任何值。用随机值填充x
和y
矩阵,但使用z
的元素就像它们来自malloc()
一样。您希望在乘法的主要部分之前将它们设置为零。您可以首先使用calloc()
分配它们,或者您可以在设置初始x
和y
值的同一个循环嵌套中将它们设置为零。了解如何在C中正确设置多维/锯齿状数组的一些指导。另请参见@RobertHarvey,当数组的维度在运行时之前是未知的(如OP的情况)时,这些如何应用?或者至少,你认为他做错了什么?不要使用模拟指针到指针的伪数组。C支持实二维矩阵。只需执行double(*A)[n]=malloc(sizeof(double[n][n])代码>查看有关如何在C中正确设置多维/锯齿状数组的一些指导。另请参见@RobertHarvey,当数组的维度在运行时才知道时,如OP的情况,这些指导如何适用?或者至少,你认为他做错了什么?不要使用模拟指针到指针的伪数组。C支持实二维矩阵。只需执行double(*A)[n]=malloc(sizeof(double[n][n])代码>此外,输出X和Y矩阵的格式看起来非常混乱。让它更清晰是值得的,比如以矩阵形式分别打印X和Y。不,我不这么认为。z数组正在为
循环的最后一个嵌套的中赋值。@RobertHarvey,不,不完全正确。z
数组正在最后一个循环嵌套中加符号(z[i][j]+=x[i][k]*y[k][j];
)。因此,乘法循环之前的z
中的值很重要。在任何情况下,在我解决了我描述的初始化问题后,OP的代码对我有效。你能告诉我如何初始化它吗@另外,输出X和Y矩阵的格式看起来非常混乱。让它更清晰是值得的,比如以矩阵形式分别打印X和Y。不,我不这么认为。z数组正在为
循环的最后一个嵌套的中赋值。@RobertHarvey,不,不完全正确。z
数组正在最后一个循环嵌套中加符号(z[i][j]+=x[i][k]*y[k][j];
)。因此,乘法循环之前的z
中的值很重要。在任何情况下,在我解决了我描述的初始化问题后,OP的代码对我有效。你能告诉我如何初始化它吗@约翰伯林格
int main()
{
int n = 0;
int i = 0;
int j = 0;
int k = 0;
int **x;
int **y;
int **z;
printf("Enter size of matrix - (N x N):");
scanf("%d", &n);
x = malloc(n * sizeof(int *));
y = malloc(n * sizeof(int *));
z = malloc(n * sizeof(int *));
for(i = 0; i < n; i++)
{
x[i] = malloc(n * sizeof(int));
y[i] = malloc(n * sizeof(int));
z[i] = malloc(n * sizeof(int));
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
x[i][j] = (rand()% 10) + 1;
y[i][j] = (rand()% 10) + 1;
}
}
for(i = 0; i < n; i++)
{
printf("\n");
for(j = 0; j < n; j++)
{
printf("%2d ", x[i][j]);
printf("%2d ", y[i][j]);
}
}
for(i = 0; i < n; i++)
{
printf("\n\n");
for(j = 0; j < n; j++)
{
for(k = 0; k < n; k++)
{
z[i][j] += x[i][k] * y[k][j];
}
printf("%2d ", z[i][j]);
}
}
}