如何在MATLAB中交换矩阵的行组?

时间:2016-01-18 16:43:19

标签: matlab

我有一个矩阵A,矢量x如下(左侧)

enter image description here

其中S0,H0,...是每个块的行号。我想交换这些块,如S0和S1; H0和H1靠近在一起作为右侧。这是我的代码

S0=3;
H0=2; 
N0=2;
S1=4;
H1=5;
N1=4;
Cols=5;
Rows=S0+H0+N0+S1+H1+N1;
A=randi(10,[ Rows Cols]);
x=randi(10,[Rows 1]);
%% Exchange two block
temp=A(S0+H0+1:S0+H0+N0,1:end);
A(S0+H0+1:S0+H0+H1,1:end)=A(S0+H0+N0+S1+1:S0+H0+N0+S1+H1,1:end);
A(S0+H0+N0+S1+1:S0+H0+N0+S1+H1,1:end)=temp;
%% How exchange x

上面的代码不起作用。如何在MATLAB中修复它?提前谢谢。

2 个答案:

答案 0 :(得分:2)

我假设您使用的是包含Row行和Cols列的二维矩阵。

您可以使用冒号:作为第二个索引来处理完整行,例如第三排:

A(3, :)

(等于A(3, 1:end)但稍微清楚一点。)

所以你可以将你的矩阵分成几行并像这样重新排列它们(将这些线重新组合成一个二维矩阵):

A = [ A(3:4, :); A(1:2, :); A(5:end, :) ]

这会在开始时移动第3行和第4行,然后是第1行和第2行,然后是所有其他行。这对你有帮助吗?

提示:您可以使用eye进行试验。

答案 1 :(得分:2)

使用mat2cellcell2mat -

的一种方法
grps = [S0,H0,N0,S1,H1,N1]
new_pattern = [1 4 2 5 3 6]

celldata_roworder = mat2cell((1:size(A,1))',grps);  %//'
newx = cell2mat(celldata_roworder(new_pattern)).';  %//'
newA = A(newx,:)

示例运行 -

输入:

A =
     6     8     9     8     7
     4     8     8     3     4
     3     8     2     1    10
     5     2     6     8     3
     5     7     4     7     7
     4     5     6     8     7
     6     3     4     7     4
     8     1     5     5     2
     5     9     2     4     1
     5     2     3     9     5
     2     2     1     4     2
     1     7    10     9     8
     3     9     7     8     4
     4     6    10     9     9
     7     8     2     6     8
    10     2    10     7     6
    10    10     8    10     2
     5     6     6     5    10
     3     7     5     1     3
     8     1     3     9    10
grps =
     3     2     2     4     5     4
new_pattern =
     1     4     2     5     3     6

输出:

newx =
     1     2     3     8     9    10    11     4     5    12 ...    
    13    14    15    16     6     7    17    18    19    20
newA =
     3     3     2     5     8
     4     3     3     7     7
     1     5     2     8     1
     4     6     4     1     4
     7     1     5     8     8
     4     9    10    10     8
     7    10    10     4     3
     7     3     1     6     9
     2     9     2     6    10
     1     1     7    10     3
    10    10    10     4     7
     9     1     8     9     5
     8     7     4     5     7
     9     8     7     5     3
     1    10     7     6     8
     8     1    10     6     1
     4     6     3     3     2
     7     9     3     2     9
     6     9     7     4     8
     6     7     6     8    10