2015-01-05 28 views
3

假設我有一個2乘9的矩陣。我想用這個矩陣內的2×3矩陣替換a(2,3),a(2,6)a(2,9)元素。例如:針對其特定列的排序索引改變矩陣的多列

a = 

    0.4 0.4 0.5 0.6 0.2 0.2 0.6 0.2 0.6 
    0.5 0.8 0.9 0.9 0.6 0.6 0.1 0.2 0.8 

[b i] = sort(a(2,3:3:end),2,'descend') 

b = 

    0.9 0.8 0.6 


i = 

    1  3  2 

所以,我想有以下矩陣:

a = 

0.4 0.4 0.5 0.6 0.2 0.6 0.6 0.2 0.6 

0.5 0.8 0.9 0.1 0.2 0.8 0.9 0.6 0.6 
+0

你的意思是* 2 * -by- * 9 *對嗎? – Dan

+0

是的,我現在編輯。 – kenes

回答

4

嘗試轉換爲細胞基質,然後再使用i重新排列細胞

[b i] = sort(a(2,3:3:end),2,'descend') 

A = mat2cell(a, 2, 3*ones(1,3)); 
cell2mat(A(i)) 

如果由於某種原因你不想將整個a轉換爲單元矩陣,你可以通過擴展索引矢量i來索引全部e欄。在你的情況你需要:

I = [1,2,3,7,8,9,4,5,6] 

,您可以生成使用循環或者使用bsxfun獲得

[1 7 4 
2 8 5 
3 9 6] 

,然後 「壓平」 使用reshape

I = reshape(bsxfun(@plus, 3*s-2, (0:2)'), 1, []) 

然後最後

a(:,I) 
+0

它的工作原理,但有沒有另一種方式做到這一點,而不轉換爲單元格矩陣 – kenes

+0

@kenes爲什麼不使用單元格數組方法?但是,是的,你可以沒有它,看到我的編輯 – Dan

+0

我後來注意到,你再次將單元格更改爲矩陣。抱歉。 – kenes

1

典型地,當2D矩陣被分成塊,最佳實踐IST使用多個維度:

a=reshape(a,size(a,1),3,[]); 

現在可以訪問每個塊經由a(:,:,1) 排序使用:如果

[~,idx]=sort(a(2,3,:),'descend') 
a=a(:,:,idx) 

真的需要一個2d矩陣,換回來:

a=reshape(a,2,[]) 
0

sortrows -based approach:

n = 3; %// number of columns per block 
m = size(a,1); 
a = reshape(sortrows(reshape(a, m*n, []).', -m*n).', m, []); 

這可以通過將每個塊重新整形成一行,根據最後一列對行進行排序並重新整形。