C 如何知道两个方法是否对相同数据的不同表示方式执行相同的操作
我有两种不同的矩阵表示法 矩阵另存为数组C 如何知道两个方法是否对相同数据的不同表示方式执行相同的操作,c,arrays,matrix,C,Arrays,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, d
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;
浮点数e=0,de,yp;
对于(i=0;i
这一个在我看来应该做同样的事情:
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;
}
浮点a(浮点**x,浮点**b,整数m,整数n){
int i,j;
浮点数e=0,de,yp;
对于(i=0;i
有没有一种聪明的方法可以比较这两种方法,而不必尝试编写同一输入的两种不同表示形式,并检查两种方法的输出是否相同
注:
线
de=fabs(x[i*(n+1)+n]-yp)代码>在firs方法中似乎是一个错误,因为我不知道这行应该做什么。。。我不是该方法的一维版本的作者,所以我不知道作者的真实意图,我正在尝试调整代码以处理多维矩阵,出于这个原因,我将这一行解释为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];
如果不尝试为同一输入编写两种不同的表示形式,并检查两种表示形式的输出是否相同,那么就没有+1
..“-为什么需要其他方法?这就是功能测试的方式;给定一个输入x
,输出是什么y
。向他们输入两组数据并比较结果有什么困难?我相信您在分配内存以使**x
按预期方式工作时非常小心……您必须创建指向2D矩阵每行第一个值的指针数组。如果您不知道我在说什么,那么我怀疑您的第二个代码将无法按预期工作。您能否显示为x
分配内存的代码,以及如何调用第二个函数?问题是,我必须在至少10个方法上多次执行相同的操作。了解如何将第一个表示中的迭代视为数组的数组可以节省我很多时间。@Floris分配正确,方法编译并返回一个值,我对迭代有疑问。(第一个来自另一个程序,两个程序都处理随机值,因为如果我找不到更好的方法来比较两者,我必须多次正确地重写输入)操作,分心,你是对的。。。。但我的主要疑问在于这一行de=fabs(x[i*(n+1)+n]-yp)你认为我的2D转换对吗?不,我不这么认为。更重要的是,一个j循环只到行de=fabs(x[i*(n+1)+n]-yp)代码>似乎是一个错误,因为我不知道这行应该做什么。。。(请注意,我不是该方法的一维版本的自动执行者,因此我不知道作者的真实意图,我正在尝试调整代码以使用多维矩阵)。因此,我将其解释为de=fabs(x[I*(n+1)+j]-yp)代码>代码看起来像是向量和矩阵的乘积-但随后进行了一些奇怪的减法,坦率地说,它应该溢出到矩阵的末尾(取决于调用第一个代码时m
和n
的值)。但是我很确定第二个代码和第一个代码做的事情不一样。只需在第二次通过内部循环时打印出i
和j
的值,并在1D的情况下打印索引的值-您将看到您甚至没有重复相同的次数。请注意,您担心的行发生在j
循环完成之后,因此,您依赖于循环结束后的j
值。如果将j
视为真正的局部变量(使用for(int j=0;j
for (i = 0; i < m; i++) {
yp = 0;
for (j = 0; j < n-1; j++)
yp += x[i][j] * b[j][0];
yp += x[i*n + j];