Да, я использовал циклическую операцию. Однако мне было интересно, был ли какой-то трюк, использующий только матричные операции или индекс, потому что они быстрее.
м, у вас есть 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 измерений. Спасибо за вашу помощь, вы освещаете путь. :)