【发布时间】:2010-09-12 23:02:28
【问题描述】:
所以我试图在 c 中乘以矩阵。但是,当我尝试将两个数组中的数字相乘并将它们放入答案数组时,它始终为零。这是方法的代码,谢谢。
我的矩阵结构:
typedef struct matrix {
int r;
int c;
double **mat;
} *matrix_t;
我的矩阵乘法:
matrix_t mat_mult(matrix_t a, matrix_t b)
{
int i, j, k;
double x, temp1, temp2;
double tempsol = 0.0;
x = temp1 = temp2 = 0;
matrix_t answer;
if(a -> c == b -> r)
{
answer = mat_new(a -> r, b -> c);
for(i = 0; i < a -> r; i++)
for( j = 0; j < b -> c; j++)
{
for( k = 0; k < a -> c; k++)
{
tempsol += a->mat[i][k] * b->mat[k][j];
answer-> mat[i][j] = tempsol;
}
}
return answer;
}
else if(a -> r == b -> c)
{
answer = mat_new(a -> c, b -> r);
return answer;
}
else
{
printf("Matrices could not be multiplied");
exit(1);
return;
}
}
这也是我的 mat_new 的代码
matrix_t mat_new(int r,int c)
{
int i = 0;
double **a;
matrix_t matrix_a;
a = (double**)malloc(r *sizeof(double *));
for(i = 0; i < r; i++)
{
a[i] = (double*)malloc(c *sizeof(double));
}
matrix_a = (matrix_t) malloc ( sizeof(struct matrix));
matrix_a -> mat = a;
matrix_a -> r = r;
matrix_a -> c = c;
return matrix_a;
}
【问题讨论】:
-
代码块中的代码不正确。你应该编辑和更正那个。此外,只是好奇,您是否正确地为双 **mat 分配内存?
-
是的,我相信内存分配正确,它可以存储值并打印它们,但由于某种原因,在这种方法中它不会让我将其他两个矩阵中的数字相乘并将其放入“答案”矩阵。如果我添加它们,它会起作用,但相乘什么都不做。
-
我是这个网站的新手,你的意思是它在代码块中不正确。
-
Re: 以上:您可能会发现分配内存的线性数组比分配所有行指针 (
r * sizeof(double*)) 然后分配每一列 (c * sizeof(double)) 更容易,这样可以节省你r分配。然后,要获取数组的第i行、j列的元素,请访问mat[i * c + j],其中c是列数。 -
@jbernie2:Goutham 的意思是您发布它时它的格式可能不正确。如果你用四个空格缩进你的代码,它会得到语法高亮和适当的间距。我看到@wallyk 已经为你解决了。
标签: c struct multidimensional-array