Да, я использовал циклическую операцию. Однако мне было интересно, был ли какой-то трюк, использующий только матричные операции или индекс, потому что они быстрее.

м, у вас есть 1D матрица

a = rand(1,5);
[sa i] = sort(a);

тогдаsa а такжеa(i) такие же. Однако, если размер матрицы увеличивается

a = rand(3,4);
[sa i] = sort(a);

тогдаsa а такжеa(i) не то же самое. И то же самое происходит, когда я пытаюсь отсортировать трехмерную матрицу по ее третьему измерению.

Как я могу получить доступ к значениямa через указательi? Или, другими словами, как я могу вычислитьsa=a(X), чтоX должно быть?

Редактировать:

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

Алгоритм выполняет построение индексов матрицы. MATLAB индексировать ячейки столбца мудро. Следовательно, индекс определяется как

idx = r + (c-1)*ROWS + (p-1)*ROWS*COLS

где,idx это индекс,r позиция строки,c это позиция столбца, иp это позиция страницы.

Поэтому, если мы сортируем в первом измерении (нормальноеsort(a)) индекс результата - это позиция в столбцах; если мы сортируем во втором измерении, индекс результата - это позиция в строках; и если мы отсортируем в третьем измерении, индекс результата будет позицией страницы. Это, как говорится, только последним производить строки и столбцы для данного случая:

r = repmat((1:rows)',[1 cols pages]);
c = repmat(1:cols,[rows 1 pages]);

Сортировка по первому измерению объясняется приведенными решениями. Затем, давайте отсортируем во втором измерении (по строке) двумерного массива

a = rand(4,5);
[rows cols pages] = size(a);
R = repmat((1:rows)',[1 cols pages]);
[sa idx] = sort(a,2);
nIdx = R + (idx-1)*rows;
isequal(sa,a(nIdx))

Теперь, если мы используем ту же идею для сортировки в третьем измерении (по страницам), нам нужно сделать

a = rand(4,5,3);
[rows cols pages] = size(a);
R = repmat((1:rows)',[1 cols pages]);
C = repmat(1:cols,[rows 1 pages]);
[sa idx] = sort(a,3);
nIdx = R + (C-1)*rows + (idx-1)*rows*cols;
isequal(sa,a(nIdx))

И та же самая логика может использоваться, чтобы расширить это до N измерений. Спасибо за вашу помощь, вы освещаете путь. :)

Ответы на вопрос(4)

Ваш ответ на вопрос