блокировка матрицы дает ошибку сегментации

0

Я пытаюсь реализовать алгоритм Штрассена в 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". Изображение 174551

Почему "i" имеет неправильное значение, которое даже выходит за пределы условия цикла? Есть ли более удобный способ сделать разбиение, чем этот способ?

Теги:
matrix
strassen

2 ответа

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!
            }
        }
    }
  • 0
    Я думаю, что вы правы вначале. Я сделал действительно глупую ошибку, не сбрасывая i, j для секционированных матриц. Спасибо! Однако мы можем использовать & как логический оператор.
  • 1
    Да, вы правы, вы можете использовать & в этом случае. Это необычно, и именно это привлекло мое внимание, но вы правы.
Показать ещё 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. Вы, похоже, игнорируете этот код, что, возможно, может. Я ожидаю, что вам нужно подумать о том, где вы хотите, чтобы нечетные значения пошли, и сделать вспомогательные массивы, достаточно большие для округленных частей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню