矩阵阻塞给出了分段错误

时间:2013-11-22 02:32:17

标签: c++ c matrix strassen

我正在尝试用C ++实现Strassen算法。我想将方阵“hA”分成4个相等的块。

// Initialize matrices on the host
float hA[N][N],ha11[N / 2][N / 2], ha12[N / 2][N / 2], ha21[N / 2][N / 2],
        ha22[N / 2][N / 2];
for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        hA[i][j] = i;
        //hB[i][j] = i;
    }
}
for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        printf("\n%d,%d\n", i, j);
        if (i < N / 2 & j < N / 2) {
            ha11[i][j] = hA[i][j];
        } else if (i < N / 2 & j >= N / 2) {
            ha12[i][j] = hA[i][j];
        } else if (i >= N / 2 & j < N / 2) {
            ha21[i][j] = hA[i][j];
        } else if (i >= N / 2 & j >= N / 2) {
            ha22[i][j] = hA[i][j];    //faulty!
        }
    }
}

我使用上面的方法进行分区,它会出现故障,如下面的输出所示。但是当我删除'if else'阶梯中的最后一个比较时,它工作正常。 enter image description here

为什么“我”的错误值甚至超出了循环条件?有没有比这种方式更方便的分区方式?

2 个答案:

答案 0 :(得分:3)

要使用所写的代码,你的子数组需要每个NxN,而不是N / 2的N / 2,但我不认为这实际上是“错误”。

您正在将阵列切成4个相等的部分,因此它们应该能够小于原始阵列。这留下了两个问题。

你的作业有误,h11很好,但h12,h21和h22都需要这样调整:

ha12[i-N/2][j-N/2] = hA[i][j];
ha21[i-N/2][j] = hA[i][j];
ha22[i-N/2][j-N/2] = hA[i][j];

而不是你拥有的,(尽管保留它们的位置)。

顺便说一下,如果你完全删除if语句,迭代超过四分之一,但每季度做4次分配,可能会更容易阅读。

第二个潜在的问题当然是当N不能被2整除时会发生什么。你的代码似乎忽略了这个,也许它可以。我希望你需要考虑你想要奇数值的位置,并使每个子阵列足够大,以便对其进行舍入。

答案 1 :(得分:0)

您的阵列应为N x N,而不是N / 2 x N / 2。

您使用按位运算符&amp;是不寻常但有效。我错误地认为你需要一个逻辑和(&amp;&amp;)代替。不过,为了便于阅读,我建议使用&amp;&amp ;.你也会遇到短路。

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("\n%d,%d\n", i, j);
            if (i < N / 2 & j < N / 2) {
                ha11[i][j] = hA[i][j];
            } else if (i < N / 2 & j >= N / 2) {
                ha12[i][j] = hA[i][j];
            } else if (i >= N / 2 & j < N / 2) {
                ha21[i][j] = hA[i][j];
            } else if (i >= N / 2 & j >= N / 2) {
                ha22[i][j] = hA[i][j];    //faulty!
            }
        }
    }