Сортировка и сохранение индекса массива n-измерений - MATLAB

У меня есть массив 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 ответа

Решение

Это должен быть общий код для любого многомерного входного массива -

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

Общий код обязан своей благодарностью этому прекрасному решению.

Я думаю, это то, что вы хотите:

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]

который соответствует вашему выводу.

Другие вопросы по тегам