c++ - 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;
}
}
解决方案
当矩阵不是正方形时,线
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 索引。
提高可读性的建议
代替n
and m
,使用num_rows
, and num_columns
。你会发现你的代码更具可读性。
推荐阅读
- javascript - 在Javascript的循环中将数组中的值分配给三个不同的数组?
- apache-kafka - 使用 Avro 的单个 Kafka 主题中的多种消息类型
- python - python web抓取代码不会打开链接
- ignite - 集群中的节点变得不稳定无法加入集群并无限期挂起时引发问题
- arrays - 正则表达式检查:返回布尔值和答案
- vb.net - 与 Adobe DC 的打开实例交互
- audio - 在本地播放 Roblox 上的音乐
- php - Yii2 kartik/date/datepicker 在更新时显示错误的格式
- php - Wordpress WP-PageNavi 不适用于主页上的特定类别帖子
- r - 集群标签在水平 hclust dendrogram 上被切断