相对于其特定列的排序索引更改矩阵的多个列

时间:2015-01-05 13:01:52

标签: matlab sorting

我们说我有一个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

3 个答案:

答案 0 :(得分: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来索引所有列。在您的情况下,您需要:

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)

答案 1 :(得分:1)

通常,当将2d矩阵分成块时,最佳做法是使用更多维度:

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

现在您可以通过a(:,:,1)访问每个区块 排序使用:

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

如果你真的需要2d矩阵,请改回:

a=reshape(a,2,[])

答案 2 :(得分:0)

基于sortrows的方法:

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

这可以通过将每个块重新整形为一行,根据最后一列对行进行排序,然后重新整形来实现。