所以我试图在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;
}
答案 0 :(得分:1)
您需要free
您的对象。您需要重置tempsol
。但最重要的是,您需要查看mat_mult()
。
matrix_t mat_mult(matrix_t a, matrix_t b)
{
/* ... */
if(a -> c == b -> r)
{
/* ... */
}
else if(a -> r == b -> c)
{
/* BZZZZT! */
answer = mat_new(a -> c, b -> r); /* BZZZZT! mat_mult(b, a); */
/* BZZZZT! */
return answer;
}
else
{
/* ... */
}
}
答案 1 :(得分:0)
这适用于您的示例:
matrix_t mat_new(int r,int c)
{
matrix_t new = malloc(sizeof*new);
new->r = r;
new->c = c;
new->mat = malloc( r*c*sizeof(double) );
return new;
}
答案 2 :(得分:0)
似乎所有问题都源于将矩阵值读取为整数而不是双精度。如果将read_mat()中的temp更改为int,然后在将其放入矩阵时将其转换为double,则一切正常。
答案 3 :(得分:-1)
您的代码不包含任何明显的错误。也许问题在于你的mat_new()。您在矩阵结构中将mat定义为double **mat;
的方式,我不建议,可能会导致一些问题。
要为mat分配2x2矩阵,您需要执行以下操作:
mat = new (double*)[2];
mat[0] = new double[2];
mat[1] = new double[2];
或n×m矩阵:
mat = new (double*)[n];
for (int i=0;i<n;i++) {
mat[i] = new double[m];
}
这是你在做什么?