我们说我有一个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 :(得分: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, []);
这可以通过将每个块重新整形为一行,根据最后一列对行进行排序,然后重新整形来实现。