我正在尝试在C中实现矩阵乘法。如果我使用矩阵大小超过3,我会得到分段错误错误。对于2x2矩阵,这个代码可以很好地工作。我试图找出原因。
这是我的代码。请看看它,让我知道我做错了什么。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*
matrix data structure.
rs = row start
re = row end
cs = column start
ce = column end
a = pointer to array of pointers
*/
typedef struct _matrix {
int rs;
int re;
int cs;
int ce;
int **a ;
}matrix;
matrix random_matrix(int n)
{
matrix random;
int i, j, k;
random.a = (int **)malloc(sizeof(int *) * n);
for (k=0; k < n; k++)
random.a[k] = (int *)malloc(n * sizeof(int));
random.cs = random.rs = 0;
random.ce = random.re = n -1;
for(i=0; i < n; i++){
for(j = 0; j < n; j++){
random.a[i][j] = rand()/108108108.0;
}
}
return random;
}
void display(matrix m)
{
int i, j;
for (i=m.rs ; i<=m.re ; i++) {
for (j=m.cs ; j<=m.ce ; j++) {
if(j==m.ce)
printf("%d", m.a[i][j]);
else
printf("%d, ", m.a[i][j]);
}
printf("\n");
}
printf("\n");
return;
}
matrix multiply(matrix m1, matrix m2)
{
int n = m1.re - m1.rs;
matrix result;
result.rs = result.cs = 0;
result.re = result.ce = n;
result.a = (int **)malloc(sizeof(int *) * n);
for (int k=0; k < n; k++)
result.a[k] = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
float sum = 0;
for (int k = 0; k < n; k++)
sum += m1.a[i][k] * m2.a[k][j];
result.a[i][j] = sum;
}
}
return result;
}
int main(void)
{
srand(time(NULL));
matrix m1 = random_matrix(3);
matrix m2 = random_matrix(3);
display(m1);
display(m2);
printf(" RESULT \n");
display(multiply(m1, m1));
return 0;
}
答案 0 :(得分:0)
令您感到困惑的rs
,re
,cs
,ce
导致&#34; 不自然&#34; rs或cs
开始,以re
或ce
结束的> 1 循环是multiply
中的原因
result.re = result.ce = n;
但应该是
result.re = result.ce = n - 1;
永远不要这样做,只需使用两个名为rows
和columns
的指标,以及你的循环
for (int row = 0 ; row < m.rows ; ++row)
{
for (int column = 0 ; column < m.columns ; ++column)
{
}
}
并完全避免混淆。
注意:您的代码中没有free()
,因为每malloc()
必须有一个free()
,它不是一个巨大的你的代码有问题,但考虑一个长期存在的程序,如守护进程/服务(取决于你如何调用它们,但它们是相同的),小内存泄漏将成为一个主要问题。
void free_matrix(matrix *m)
{
for (int i = m->rs ; i <= m->re ; ++i)
free(m->a[i]);
free(m->a);
}
1 在某种意义上说不自然,对于有经验的程序员来说,正确阅读它们并不容易,并且可能导致你正在处理的代码中的错误子>