2016-01-18 38 views
0

我有一個矩陣A,和矢量x爲以下的(左側)如何在MATLAB中交換矩陣的一組行?

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

一種方法與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 
+2

自從我最後訪問SO後已經有一段時間了。我從你身上看到的第一句話是:「一種排列和重塑的方法」。沒有太多變化...:P –

+0

@Divakar。我用給定的條件交換行。你可以使用符號S0。 H0 ...爲您的代碼。和向量x也需要交換 – Jame

+0

@StewieGriffin是的,沒有什麼改變!我被詛咒堅持使用'bsxfun','permute','reshape'三重奏;) – Divakar

2

我假設您使用的是具有行和Cols列的2維矩陣。

您可以使用冒號:作爲第二個索引來尋址整行,例如,對於第三行:

A(3, :) 

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

所以,你可以在你的矩陣拆分成線,這樣的重新安排他們(將重新走到一起的線二維矩陣):

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

這在一開始移動行3和4,然後是舊線路1和2,然後是其餘的。這對你有幫助嗎?

提示:您可以使用eye進行試驗。

+1

這應該是值得嘗試'A = A([3:4,1 :2,5:結束],:)',以及它應該工作。 –

+0

您可以使用符號S0,H0作爲您的代碼嗎?並且向量x也需要傳達 – Jame

+0

@AndrasDeak - 感謝提示,+1 :) –