2015-01-05 30 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, []); 

这可以通过将每个块重新整形成一行,根据最后一列对行进行排序并重新整形。