Jame
Jame

Reputation: 3854

How to exchange group of rows of a matrix in MATLAB?

I have a matrix A ,and vector x as following (left side)

enter image description here

where S0, H0,...is row number of each block. I want to exchange these blocks such that S0 and S1; H0 and H1 are near together as right side. This is my code

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

The above code is not work. How can I fixed it in MATLAB? Thank in advance.

Upvotes: 0

Views: 176

Answers (2)

Divakar
Divakar

Reputation: 221514

One approach with mat2cell and cell2mat -

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,:)

Sample run -

Input :

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

Output:

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

Upvotes: 2

Matthias W.
Matthias W.

Reputation: 1077

I assume you are using a 2-dimensional matrix with Row rows and Cols columns.

You can use the colon : as a second index to address a full row, e.g. for the third row:

A(3, :)

(equal to A(3, 1:end) but little bit clearer).

So you could split your matrix into lines and re-arrange them like this (putting back together the lines to a two-dimensional matrix):

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

This moves rows 3 and 4 at the beginning, then old lines 1 and 2 and then all the rest. Does this help you?

Hint: you can use eye for experimenting.

Upvotes: 2

Related Questions