通过参考传递的二维向量的原位转置

时间:2019-06-07 13:03:15

标签: c++ matrix transpose

我正在尝试计算矩阵的转置。现在,我已将矩阵作为2维向量传递,并且由于我希望函数计算就位转置,因此我通过引用传递了2维向量。但这似乎没有效果。

我尝试使用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 MatrixTranspose变得一样。

1 个答案:

答案 0 :(得分:3)

问题不在于传递矩阵的方式,也不在于交换的方式。问题出在您的逻辑上:

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

这将导致元素交换两次 ,从而取消了对转置矩阵的尝试。

尝试像这样循环直到i,而不是N

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

相反。