排序并保持n维数组的索引 - MATLAB

时间:2014-10-30 19:32:31

标签: arrays matlab sorting indexing n-dimensional

我有一个12-D数组,我正在使用每个维度作为优化问题中的索引值。

A(:,:,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10)

每个索引值i是1到5之间的值。

我想从最大到最小排序A并跟踪索引,因此我知道哪些索引对应于A的值。

所以我的理想输出是一个2列的单元格/数组,其中一列是值,另一列是索引值。

对于一个简单的3D示例:说我有一个3D数组:A(:,:,i1)

其中:

A(:,:,1) =  2 
A(:,:,2) =  6 
A(:,:,3) =  13 
A(:,:,4) =  11 
A(:,:,5) =  5  

我希望我的输出为:

13   3
11   4
6    2
5    5
2    1

编辑:

假设我有1x1x3x3大小的输入,以便

A(1,1,1,1)= 3

A(1,1,2,1)= 1

A(1,1,3,1)= 23

A(1,1,1,2)= 12

A(1,1,2,2)= 9

A(1,1,3,2)= 8

A(1,1,1,3)= 33

A(1,1,2,3)= 14

A(1,1,3,3)= 6

预期输出为:

33 [1,1,1,3]

23 [1,1,3,1]

14 [1,1,2,3]

12 [1,1,1,2]

9 [1,1,2,2]

8 [1,1,3,2]

6 [1,1,3,3]

3 [1,1,1,1]

1 [1,1,2,1]

2 个答案:

答案 0 :(得分:2)

这应该是任何多维输入数组的通用代码 -

%// Sort A and get the indices
[sorted_vals,sorted_idx] = sort(A(:),'descend'); 

%// Set storage for indices as a cell array and then store sorted indices into it
c = cell([1 numel(size(A))]); 
[c{:}] = ind2sub(size(A),sorted_idx);

%// Convert c to the requested format and concatenate with cell arary version of 
%// sorted values for the desired output
out = [num2cell(sorted_vals) mat2cell([c{:}],ones(1,numel(A)),numel(size(A)))]; 

通用代码非常感谢this fine solution

答案 1 :(得分:1)

我想这就是你想要的:

b=A(:);
[sorted_b,ind]=sort(b,'descend');
[dim1,dim2,dim3,dim4]=ind2sub(size(A),ind);

%arranging in the form you want
yourCell=cell(size(b,1),2);
yourCell(:,1)=mat2cell(sorted_b,ones(size(b,1),1),1);

%arranging indices -> maybe vectorized way is there for putting values in "yourCell"
for i=1:size(b,1)
    yourCell{i,2}=[dim1(i) dim2(i) dim3(i) dim4(i)];
end

对于您提供的数组A,我的输出如下:

33  [1,1,1,3]
23  [1,1,3,1]
14  [1,1,2,3]
12  [1,1,1,2]
9   [1,1,2,2]
8   [1,1,3,2]
6   [1,1,3,3]
3   [1,1,1,1]
1   [1,1,2,1]

与您的输出匹配。