3

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

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]

4

2 回答 2

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)))]; 

通用代码感谢这个优秀的解决方案

于 2014-10-30T20:37:29.470 回答
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]

与您的输出匹配。

于 2014-10-30T19:56:23.037 回答