我有两种不同的矩阵表示法。
Matrix保存为数组 float*
:
| 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 |
作为数组 float**
| 1.0 2.0 3.0 |
| 4.0 5.0 6.0 |
| 7.0 8.0 9.0 |
我有这种方法在矩阵上作为数组工作:
float a(float* x, float* b, int m, int n) {
int i, j;
float e = 0, de, yp;
for (i = 0; i < m; i++) {
yp = 0;
for (j = 0; j < n; j++)
yp += x[i*(n+1)+j] * b[j];
de = fabs(x[i*(n+1)+n]-yp);
e += (de*de);
}
return e;
}
这个在我的意图中应该做同样的事情:
float a(float **x, float **b, int m, int n) {
int i, j;
float e = 0, de, yp;
for (i = 0; i < m; i++) {
yp = 0;
for (j = 0; j < n; j++)
yp += x[i][j] * b[j][0];
de = fabs(x[i][j]-yp);
e += (de*de);
}
return e;
}
有没有一种聪明的方法来比较这两种方法而不尝试写两个不同的同一输入表示并检查输出是否相同?
注意:
第一个方法中的行de = fabs(x[i*(n+1)+n]-yp);
似乎是一个错误,因为我看不出该行应该做什么...我不是该方法的单维版本的作者,所以我不知道作者的真实意图,我正在尝试调整代码以使用多维矩阵,因此我将此行解释为de = fabs(x[i*(n+1)+j]-yp);
,但我不确定这一点。
答案 0 :(得分:1)
即使您已正确分配内存,也不会按照预期的方式索引第一个数组。看看这些行:
for (i = 0; i < m; i++) {
yp = 0;
for (j = 0; j < n; j++)
yp += x[i*(n+1)+j] * b[j];
你希望这与
是一回事 for (i = 0; i < m; i++) {
yp = 0;
for (j = 0; j < n-1; j++)
yp += x[i][j] * b[j][0];
但是当你有一维数组时,如果每行有x[i][j]
个元素,则相当于索引一个二维数组n
yp += x[i*n + j];
没有+1
...