【发布时间】:2014-06-28 18:50:12
【问题描述】:
我有两种不同的矩阵表示。
矩阵保存为数组 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;
}
有没有一种聪明的方法来比较这两种方法,而无需尝试编写相同输入的两种不同表示并检查两者的输出是否相同?
注意:
fis 方法中的de = fabs(x[i*(n+1)+n]-yp); 行似乎是一个错误,因为我看不到这条线应该做什么......我不是该方法的单维版本的作者,所以我不知道真实的作者的意图,我正在尝试调整代码以处理多维矩阵,因此我将此行解释为de = fabs(x[i*(n+1)+j]-yp);,但我不确定。
【问题讨论】:
-
"没有尝试编写相同输入的 2 个不同表示并检查两者的输出是否相同?" - 为什么你需要任何其他方式?这就是测试功能的方式;给定输入
x,输出y是什么。给他们提供两组数据并比较结果有什么难的? -
我相信你很小心你是如何分配内存来让
**x按照你想要的方式工作的……你必须创建一个指向二维矩阵每一行中第一个值的指针数组.如果您不知道我在说什么,那么我怀疑您的第二个代码将无法按您的预期工作。您能否展示为x分配内存的代码,以及如何调用第二个函数? -
问题是我必须在至少 10 种方法上多次执行相同的操作。了解如何查看第一个表示中的迭代作为数组数组可以为我节省很多时间。
-
@Floris 分配正确,方法编译并返回我对迭代有疑问的值。 (第一个来自另一个程序,两个例程都在随机值上工作,因为如果我找不到更好的方法来比较两者,我必须多次正确地重写输入)