矩阵与**指针相乘,输出错误 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

矩阵与**指针相乘,输出错误 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()一样。您希望在乘

所以我试着做一个矩阵乘法,其中两个矩阵总是2x2或3x3,等等。我想用随机值填充这两个矩阵,然后做一个乘法。我的问题是,存储答案的第三个矩阵产生了错误的值。例如,我的前两个矩阵(对于2x2)包含值[4,7,4,6]和[8,6,7,3],我的输出是[76,48,70,45],而实际上应该是[81,45,74,42]。不知道出了什么问题?

当您使用
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]);
    }
}
}