我正在尝试用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'阶梯中的最后一个比较时,它工作正常。
为什么“我”的错误值甚至超出了循环条件?有没有比这种方式更方便的分区方式?
答案 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!
}
}
}