我有一个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]
答案 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]
与您的输出匹配。