我有两种不同的矩阵表示。
矩阵保存为数组 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);
,但我对此不确定。
最佳答案
即使您已正确分配内存,您也不会按预期方式为第一个数组编制索引。看看这些行:
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];
但是当你有一个一维数组时,如果每行有 n
个元素,那么索引一个二维数组 x[i][j]
的效果是这样的
yp += x[i*n + j];
没有+1
……
关于c - 如何知道两种方法是否对同一数据的不同表示做同样的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24469910/