Сортировка и сохранение индекса массива 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]
который соответствует вашему выводу.