Транспонирование на месте двумерного вектора, переданного по ссылке - PullRequest
2 голосов
/ 07 июня 2019

Я пытаюсь вычислить транспонирование матрицы. Теперь я передал матрицу как двумерный вектор, и, поскольку я хочу, чтобы функция рассчитывала транспонирование на месте, я передал двумерный вектор по ссылке. Но, похоже, ничего не даст.

Я пытался использовать std::swap(mat[i][j], mat[j][i]), это не имело никакого эффекта. Я снова попытался поменять местами целые числа (используя третью переменную), но все равно ничего не получилось.

#include<iostream>
#include<vector>
#include<algorithm>

#define N 5

void inPlaceTranspose(std::vector<std::vector<int> > &mat) {
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            int temp = mat[i][j];
            mat[i][j] = mat[j][i];
            mat[j][i] = temp;
            //std::swap(mat[i][j], mat[j][i]);
        }
    }
    std::cout << "Transpose:\n";
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            std::cout << mat[i][j] << " ";
        }
        std::cout << "\n";
    }
}

int main() {
    std::vector<std::vector<int> > mat(N, std::vector<int>(N));
    mat = {
        {1, 2, 3, 4, 5},
        {7, 8, 9, 10, 11},
        {13, 14, 15, 16, 17},
        {19, 20, 21, 22, 23},
        {25, 26, 27, 28, 29},
    };
    std::cout << "Original Matrix:\n";
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            std::cout << mat[i][j] << " ";
        }
        std::cout << "\n";
    }
    inPlaceTranspose(mat);
    return 0;
}

Original Matrix и Transpose оказываются одинаковыми.

1 Ответ

3 голосов
/ 07 июня 2019

Проблема не в том, как вы проходите матрицу, или в том, как вы делаете обмен.Проблема в вашей логике:

for(int j = 0; j < N; j++) {

, что приводит к замене элементов дважды , что отменяет вашу попытку транспонировать матрицу.

Попробуйте выполнить цикл доi вместо N, вот так:

for(int j = 0; j < i; j++) {

вместо.

...