我有一个C ++矩阵,A(n,n)和一个矢量P(n)看起来像这样:
P = [ 3 6 1 13 12 16 ... ]
它包含数字1:n,但不是按升序排列,而是加扰。
我的目标是将矩阵A的行和列更改为相同的顺序。例如,由于P [0] = 3,我希望第3行和第3列移动到矩阵A中的第1行和第1列。
但是因为矩阵可能非常大,我不能使用另一个大小与A相同的矩阵,因为这样会浪费。
在matlab中,只需使用以下命令即可完成:
A(P,P);
关于如何在c ++中做同样事情的任何想法?
答案 0 :(得分:1)
最简单的方法可能只是暴力破解它。最好的想法可能是逐行进行。您需要一个长度为N的辅助数组,它跟踪原始行索引和一个临时行。然后,从行R = 0开始,检查行R是否在正确的位置。如果没有,请将其复制到临时行,将右行复制到行R(在移动时置换它),然后将临时行复制到刚刚释放的位置。如果一行碰巧在正确的位置,将其复制到临时行,并在复制时置换它。
答案 1 :(得分:1)
我建议使用一个间接级别来定位单元格中的每个矩阵。
假设你的矩阵对象叫M
。而不是使用
M[R][C]
引用行R
中的单元格,列C
(假设行主矩阵排序),您将拥有一对关联的向量,让我们称它们为y
和{ {1}},因此行x
列R
中的单元格值为:
C
最初,M[y[R]][x[C]]
和y
向量都将每个“逻辑”行或列映射到相应的物理行和列,x
和y
都包含[ 0..max_row]和[0..max_col]。
然后,要在您的问题中进行交换,只需将x
向量复制到P
和y
向量。
您应该不是直接实现矩阵,而是作为一个二维x
,但作为一个独立的类:
std::vector
并实现行和列的间接映射,作为类实现的一部分。