c - 如何知道两种方法是否对同一数据的不同表示做同样的事情

标签 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, 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/

相关文章:

c - 带有 GCcflags的可变长度数组 "-Wlarger-than=len"

javascript - 在将项目从一个数组添加到另一个数组之前比较两个数组

python - 如何缩放矩阵的每一列

c - 如何初始化一个长度不固定的数组?

c - MPI_Recv 期间 MPI 程序卡住

javascript - jquery自动完成不显示数组的值

java - 没有得到矩阵JAVA主对角线所需的输出

python - 我如何把它变成一个 numpy 矩阵?

c - 变量的类型是否存储在某处?它在哪里?

javascript - 从对象中删除项目