亲爱的朋友们,我在转置矩阵时遇到了问题。转置后的矩阵包含未定义的元素。不确定出了什么问题。谢谢您抽时间见我!
entriesi是存储矩阵中元素的动态数组。元素按从左到右的顺序逐行存储。即在3X3矩阵中,entries2是第1行上的第3个元素,entries3是第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矩阵具有第二个和第三个元素的未定义元素。即(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;
}
}发布于 2019-12-02 12:56:03
当矩阵不是正方形时,行
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.想一想2D模拟。您想要使用:
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。你会发现你的代码更具可读性。
https://stackoverflow.com/questions/59132745
复制相似问题