Как получить элементы после сортировки по размерной матрице - PullRequest
0 голосов
/ 25 марта 2019

У меня есть две матрицы A & B, и я хочу отсортировать данные по обоим, используя 3-е измерение A. Для этого я использую сортировку, чтобы получить и результат, и индексы.

Чего я не знаю, так этокак использовать индексы для получения отсортированных данных по матрице B.

A = rand(2,2,2) B = rand(2,2,2) [S I] = sort(A, 3); S B(I) % Here, don't sort B according to the same sort than A

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Как отметил Сардар Усама, ключ заключается в том, чтобы преобразовать трехмерные индексы в линейные индексы. Правильная функция для этого в Matlab - sub2ind . Это не просто:

clc; clear all; close all;

n = 8;
A = rand(n, n, n);
[S, I] = sort(A, 3, 'descend');

sizeA = size(A);
sizeA1 = sizeA(1);
sizeA2 = sizeA(2);
sizeA3 = sizeA(3);

baseVecIndex1 = (1:sizeA1)';
bM1_2D = repmat(baseVecIndex1, 1, sizeA2);
bM1_3D = repmat(bM1_2D, 1, 1, sizeA3);

baseVecIndex2 = 1:sizeA2;
bM2_2D = repmat(baseVecIndex2, sizeA1, 1);
bM2_3D = repmat(bM2_2D, 1, 1, sizeA3);

linearIndexes = sub2ind(sizeA, bM1_3D, bM2_3D, I);

test = A(linearIndexes );
test(:, :, n)
S(:, :, n)
0 голосов
/ 25 марта 2019

Преобразуйте ваши трехмерные индексы в линейные индексы с помощью:

[r, c, ~] = size(A);
LinInd = (I-1)*r*c + reshape(1:r*c, r, c);  %For >=R2016b
%LinInd = bsxfun(@plus, (I-1)*r*c, reshape(1:r*c, r, c));   %For <R2016b

Теперь используйте эти линейные индексы для сортировки B т.е.:

B(LinInd)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...