首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:转置矩阵,使用一维动态数组保存元素

问C++:转置矩阵,使用一维动态数组保存元素
EN

Stack Overflow用户
提问于 2019-12-02 12:40:34
回答 1查看 141关注 0票数 0

亲爱的朋友们,我在转置矩阵时遇到了问题。转置后的矩阵包含未定义的元素。不确定出了什么问题。谢谢您抽时间见我!

entriesi是存储矩阵中元素的动态数组。元素按从左到右的顺序逐行存储。即在3X3矩阵中,entries2是第1行上的第3个元素,entries3是第2行上的第1个元素

N是矩阵的行数

M是矩阵的列数

代码语言:javascript
复制
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矩阵具有第二个和第三个元素的未定义元素。即(1 1 3)在转置返回后(1 -3452346326236 -12351251515)

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

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-02 12:56:03

当矩阵不是正方形时,行

代码语言:javascript
复制
temp[(j - 1) * m + i - 1] = entries[(i - 1) * m + j - 1];

是不对的。它需要是:

代码语言:javascript
复制
temp[(j - 1) * n + i - 1] = entries[(i - 1) * m + j - 1];
//            ^^ needs to be n, not m.

想一想2D模拟。您想要使用:

代码语言:javascript
复制
temp[j][i] = entries[i][j];

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

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

提高可读性的建议

不使用n和m,而使用num_rows和num_columns。你会发现你的代码更具可读性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59132745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档