首页 > 解决方案 > C++:矩阵的转置,使用SINGLE DIMENSION动态数组保存元素

问题描述

亲爱的朋友,我在转置矩阵时遇到问题。转置矩阵具有未定义的元素。不知道出了什么问题。感谢您的时间!

entries[i] 是存储矩阵中元素的动态数组。元素从左到右逐行存储。即在 3X3 矩阵中,entry[2] 是第 1 行的第 3 个元素,entry[3] 是第 2 行的第 1 个元素

n 是矩阵的行数

m 是矩阵的列数

Matrix Matrix::Transpose() const {
    double* temp;
    temp = new double[n * m];
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
            temp[(j - 1) * m + i - 1] = entries[(i - 1) * m + j - 1];
    }
    Matrix Result(m, n, temp);
    delete temp;
    return Result;
}

当原始矩阵为正方形时,定义了转置矩阵的所有元素。当原始矩阵为 1x3 时,生成的转置 3x1 矩阵对于第 2 个和第 3 个元素具有未定义的元素。即 (1 1 3) 后转置返回 (1 -3452346326236 -12351251515)

矩阵打印功能如下。错误也可能来自这里。

void Matrix::Print() const
{
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
            cout << setw(13) << entries[(i - 1) * m + j - 1];
        cout << endl;
    }
}

标签: c++

解决方案


当矩阵不是正方形时,线

temp[(j - 1) * m + i - 1] = entries[(i - 1) * m + j - 1];

是不正确的。它需要是:

temp[(j - 1) * n + i - 1] = entries[(i - 1) * m + j - 1];
//            ^^ needs to be n, not m.

想想二维模拟。你想使用:

temp[j][i] = entries[i][j];

entries是一个n x m矩阵。对于它,2D 索引[i][j]被转换为[i*m + j]1D 索引。

temp是一个m x n矩阵。对于它,2D 索引[j][i]被转换为[j*n + i]1D 索引。

提高可读性的建议

代替nand m,使用num_rows, and num_columns。你会发现你的代码更具可读性。


推荐阅读