gpt4 book ai didi

c - 分配内存用于两个矩阵相乘

转载 作者:行者123 更新时间:2023-11-30 18:56:14 28 4
gpt4 key购买 nike

不久前,我编写了这段代码来将两个矩阵相乘。在 main 方法中调用函数 mat_mult。我想写一些可以采用未知矩阵大小,然后根据需要分配内存的东西。当我在主方法中输出结果矩阵时,我似乎遇到了问题。如果我在 mat_mult 方法中执行 printf,矩阵条目就很好。

为什么main方法中的C矩阵显示不正确?还有我释放内存的方式,这是正确的方法吗?

#include <stdio.h>
#include <stdlib.h>

void mat_mult(int* p, int* q, int* r, int numP)
{
int i, j, k, sumC=0;

for (i = 0; i < numP; i++)
{
for (j = 0; j < numP; j++)
{
for (k = 0; k < numP; k++)
{
sumC = sumC + p[i*numP + k]*q[k*numP + j];
}
r[i*numP + j] = sumC;
sumC = 0;
}
}
for(i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", r[i*numP + j]);
}
printf("\n");
}
}

int main()
{
int A[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int B[3][3] = {{3, 2, 1}, {6, 5, 4}, {9, 8, 7}};


int i, j;
int sizA = sizeof(A)/sizeof(A[0]);

//int C[3][3] = {0};

/* sizA is the width of the array */
int **C = calloc(sizA, sizeof(int*));
for(i = 0; i < sizA; i++)
{
/* sizA is the height */
C[i] = calloc(sizA, sizeof(int));
}

for(i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", C[i][j]);
}
printf("\n");
}
mat_mult(A[0], B[0], C[0], sizA);


for(i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", A[i][j]);
}
printf("\t");
for (j = 0; j < 3; j++)
{
printf("%d ", B[i][j]);
}
printf("\t");
for (j = 0; j < 3; j++)
{
printf("%d ", C[i][j]);
}
printf("\n");
}
free(C[0]);
free(C);
return 0;
}

这是上面程序的输出。

0 0 0
0 0 0
0 0 0
42 36 30
96 81 66
150 126 102
1 2 3 3 2 1 42 36 30
4 5 6 6 5 4 150 126 102
7 8 9 9 8 7 0 0 0

Process returned -1073741819 (0xC0000005) execution time : 12.472 s
Press any key to continue.

问题已解决

@贾耶什

非常感谢你的 friend 。你最后的建议奏效了。我只是复制代码的相关部分。

    int i, j;
int sizA = sizeof(A)/sizeof(A[0]);

// int C[3][3] = {0};

/* sizA is the width of the array */
// int **C = calloc(sizA, sizeof(int*));
// for(i = 0; i < sizA; i++)
// {
// /* sizA is the height */
// C[i] = calloc(sizA, sizeof(int));
// }

int (*C)[sizA] = calloc(sizA*sizA, sizeof(int*));
/* Rest of the Code*/

free(C);

这是输出的样子。

0 0 0
0 0 0
0 0 0
42 36 30
96 81 66
150 126 102
1 2 3 3 2 1 42 36 30
4 5 6 6 5 4 96 81 66
7 8 9 9 8 7 150 126 102

Process returned 0 (0x0) execution time : 0.085 s
Press any key to continue.

仍然想知道为什么第一种方法不起作用。但再次感谢你们所有人,特别是 Jayesh。

最佳答案

问题在于您分配内存和使用内存的方式。在您的 matmult 函数中,您有以下代码:

r[i*numP + j] = sumC;

它将结果矩阵r视为一维线性数组。这很好并且会起作用,但这意味着您也必须以这种方式分配它。您的 main 例程将变为:

int main()
{
int A[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int B[3][3] = {{3, 2, 1}, {6, 5, 4}, {9, 8, 7}};

int i, j;
int sizA = sizeof(A)/sizeof(A[0]);

/* sizA is the width of the array */
int *C = calloc(sizA*sizA, sizeof(int));

for(i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", C[i*3+j]);
}
printf("\n");
}
mat_mult(A[0], B[0], C, sizA);

for(i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", A[i][j]);
}
printf("\t");
for (j = 0; j < 3; j++)
{
printf("%d ", B[i][j]);
}
printf("\t");
for (j = 0; j < 3; j++)
{
printf("%d ", C[i*3+j]);
}
printf("\n");
}
free(C);
return 0;
}

另一种方法是以这种方式寻址所有三个数组,而不是使用多维索引。它不漂亮,但很有效。

或者,为了获得更好的语法,您可以考虑将 C++ 用于此类应用程序。

关于c - 分配内存用于两个矩阵相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24970428/

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