0

我正在尝试在 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”阶梯中的最后一个比较时,它工作正常。 在此处输入图像描述

为什么 'i' 有一个错误的值,甚至在循环条件之外?有没有比这种方式更方便的分区方法?

4

2 回答 2

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 整除时会发生什么。您的代码似乎忽略了这一点,也许它可以。我希望你需要考虑你想要奇数值去哪里,并使每个子数组足够大以容纳四舍五入的部分。

于 2013-11-22T05:27:04.517 回答
0

您的数组应该是 N x N,而不是 N/2 x N/2。

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

    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!
            }
        }
    }
于 2013-11-22T02:35:41.650 回答