用c ++重新排序矩阵

时间:2016-04-02 23:50:09

标签: c++ matrix

我有一个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 ++中做同样事情的任何想法?

2 个答案:

答案 0 :(得分:1)

最简单的方法可能只是暴力破解它。最好的想法可能是逐行进行。您需要一个长度为N的辅助数组,它跟踪原始行索引和一个临时行。然后,从行R = 0开始,检查行R是否在正确的位置。如果没有,请将其复制到临时行,将右行复制到行R(在移动时置换它),然后将临时行复制到刚刚释放的位置。如果一行碰巧在正确的位置,将其复制到临时行,并在复制时置换它。

答案 1 :(得分:1)

我建议使用一个间接级别来定位单元格中的每个矩阵。

假设你的矩阵对象叫M。而不是使用

M[R][C]

引用行R中的单元格,列C(假设行主矩阵排序),您将拥有一对关联的向量,让我们称它们为y和{ {1}},因此行xR中的单元格值为:

C

最初,M[y[R]][x[C]] y向量都将每个“逻辑”行或列映射到相应的物理行和列,xy都包含[ 0..max_row]和[0..max_col]。

然后,要在您的问题中进行交换,只需将x向量复制到Py向量。

您应该不是直接实现矩阵,而是作为一个二维x,但作为一个独立的类:

std::vector

并实现行和列的间接映射,作为类实现的一部分。