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