gpt4 book ai didi

c++ - 矩阵阻塞给出了段错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:23:11 24 4
gpt4 key购买 nike

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

// 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

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

最佳答案

要使用编写的代码,您的子数组需要每个都是 NxN,而不是 N/2 x 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 整除时会发生什么。您的代码似乎忽略了这一点,也许它可以。我希望您需要考虑您希望奇数的位置,并使每个子数组都足够大以容纳四舍五入的部分。

关于c++ - 矩阵阻塞给出了段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20135924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com