Обновление 2 (для ответа на ваш обновленный вопрос)
MATLAB оптимизирован для работы с массивами. Как только вы к этому привыкнете, на самом деле очень приятно просто набрать одну строку и сделать так, чтобы MATLAB самостоятельно выполнял весь цикл 4D, не беспокоясь об этом. MATLAB часто используется для прототипирования / однократных вычислений, поэтому имеет смысл сэкономить время на программирование человека и отказаться от некоторой гибкости C [++ | #].
Вот почему MATLAB внутренне выполняет некоторые циклы действительно хорошо - часто кодируя их как скомпилированную функцию.
Фрагмент кода, который вы даете , на самом деле не содержит соответствующей строки кода, которая выполняет основную работу, а именно
% Sort along given dimension
x = sort(x,dim);
Другими словами, код, который вы показываете, должен получить доступ только к медианным значениям по их правильному индексу в теперь отсортированном многомерном массиве x
(который не занимает много времени). Фактическая работа с доступом ко всем элементам массива была выполнена с помощью sort
, которая является встроенной (то есть скомпилированной и высоко оптимизированной) функцией.
Оригинальный ответ (о том, как создавать свои собственные быстрые функции, работающие с массивами )
На самом деле существует довольно много встроенных модулей, которые принимают параметр измерения: min(stack, [], n)
, max(stack, [], n)
, mean(stack, n)
, std(stack, [], n)
, median(stack,n)
, sum(stack, n)
... вместе с тем, что другие встроенные функции, такие как exp()
, sin()
, автоматически работают с каждым элементом всего массива (т. е. sin(stack)
автоматически выполняет четыре вложенных цикла для вас, если stack
равен 4D), вы можете создать много функций, которые могут вам понадобиться, просто полагаться на существующие встроенные модули .
Если этого недостаточно для конкретного случая, вам следует взглянуть на repmat
, bsxfun
, arrayfun
и accumarray
, которые являются очень мощными функциями для выполнения действий «путем MATLAB». Просто ищите в SO вопросы (или, скорее, ответы) , используя one из этих , таким образом я узнал много о сильных сторонах MATLAB .
В качестве примера , скажем, вы хотите реализовать p-норму стека вдоль измерения n
, вы можете написать
function result=pnorm(stack, p, n)
result=sum(stack.^p,n)^(1/p);
... где вы эффективно повторно используете «способность к размеру» sum
.
Обновление
Как отмечает Макс в комментариях, взгляните также на оператор двоеточия (:
) , который является очень мощным инструментом для выбора элементов из массива (или даже изменения его формы, что более обычно делается с reshape
).
В общем, посмотрите в разделе Операции с массивами в справке - он содержит repmat
и др. упомянутый выше, но также cumsum
и некоторые более неясные вспомогательные функции, которые вы должны использовать в качестве строительных блоков.