Я пытаюсь реализовать алгоритм Штрассена в C++. Я хочу разбить квадратную матрицу "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" имеет неправильное значение, которое даже выходит за пределы условия цикла? Есть ли более удобный способ сделать разбиение, чем этот способ?
Ваши массивы должны быть 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!
}
}
}
Для работы с кодом, как написано, ваши вспомогательные массивы должны быть 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. Вы, похоже, игнорируете этот код, что, возможно, может. Я ожидаю, что вам нужно подумать о том, где вы хотите, чтобы нечетные значения пошли, и сделать вспомогательные массивы, достаточно большие для округленных частей.