需要实现一个将矩阵乘以向量的函数。矩阵是二维数组,向量是一维的。我已经实现了点乘和矩阵乘法的函数,这是我的代码:
#include <stdio.h>
double dot( double *x, double *y, int n )
{
double res = 0.0;
int i;
for (i = 0; i < n; i++)
{
res += x[i] * y[i];
}
return res;
}
void mxv( double **m, double *v, double *res, int rows, int cols )
{
int i;
for (i = 0; i < rows; i++)
{
res[i] = dot(m[i], v, cols);
}
}
int main()
{
double m[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
double v[3] = {1,2,3};
double res[3] = {0};
mxv((double**)m, v, res, 3, 3);
printf("%f \n", res[0]);
printf("%f \n", res[1]);
printf("%f \n", res[2]);
return 0;
}
结果,出现分段错误。显然,这是由于不正确的指针传递造成的。已经尝试使用以下选项
mxv(m, v, res, 3, 3);
错误仍然发生。告诉我我做错了什么,如何解决它。
让我们从根本不同的类型以不同的方式存储在内存中
int[Rows][Cols]这一事实开始。int**在第一种情况下,这是一个连续的内存区域,
a[3][2]编译器根据类型int[Rows][Cols]是指向int[Cols](!) 的指针而不是指向int*.在
int**我们有一个指针数组,每个指针都指向某个int's 数组。这是内存布局的粗略轮廓:
再一次 - 最重要的是 -
int[Rows][Col]你不是在处理指向指针的指针int,而是处理指向的指针int[Cols]。这些是完全不同的类型!