Я немного удивлен, что в MATLAB нет функции Map, поэтому я сам взломал ее, потому что без нее я не могу жить. Есть ли лучшая версия? Есть ли какая-то стандартная библиотека функционального программирования для MATLAB, которую мне не хватает?
function results = map(f,list)
% why doesn't MATLAB have a Map function?
results = zeros(1,length(list));
for k = 1:length(list)
results(1,k) = f(list(k));
end
end
использование будет например
map( @(x)x^2,1:10)
matlab
functional-programming
map-function
Уилл Несс
источник
источник
map
,foldl
(также известный какreduce
),select
(он жеfilter
), и другие незаменимые лакомства. Рекомендуется (если вам нужно использовать Matlab).Ответы:
Краткий ответ: встроенная функция
arrayfun
делает то же самое, что и вашаmap
функция для числовых массивов:Есть две другие встроенные функции, которые ведут себя аналогично:
cellfun
(которая работает с элементами массивов ячеек) иstructfun
(которая работает с каждым полем структуры).Однако в этих функциях часто нет необходимости, если вы пользуетесь преимуществами векторизации, в частности, с помощью поэлементных арифметических операторов . В приведенном вами примере векторизованное решение будет:
Некоторые операции будут автоматически выполняться с элементами (например, добавление скалярного значения к вектору), в то время как другие операторы имеют специальный синтаксис для поэлементных операций (обозначается символом
.
перед оператором). Многие встроенные функции в MATLAB предназначены для работы с векторными и матричными аргументами с использованием поэлементных операций (часто применяемых к заданному измерению, например,sum
иmean
), и, таким образом, не требуют функций карты.Подводя итог, вот несколько различных способов возвести каждый элемент массива в квадрат:
Конечно, для такой простой операции вариант №1 - наиболее разумный (и эффективный) выбор.
источник
Помимо векторных и поэлементных операций, есть также
cellfun
функции отображения на массивы ячеек. Например:Если UniformOutput имеет значение true (или не предоставлено), он попытается объединить результаты в соответствии с размерами массива ячеек, поэтому
источник
Довольно простое решение с использованием векторизации Matlab:
Теперь, набирая
возвращается
c (b) - это ссылка на вектор размера 5 с элементами c в индексах, заданных b. Теперь, если вы Ассинг значения этого опорного вектора, исходные значения в с переписываются, так как с (б) содержит ссылки на значения в с и без каких-либо копий.
источник
Кажется, что встроенный arrayfun не работает, если требуемый результат представляет собой массив функций: например: map (@ (x) [xx ^ 2 x ^ 3], 1:10)
Небольшие моды ниже улучшают эту работу:
источник
..., 'UniformOutput', false);
для создания вывода массива ячеек, содержащего ваши массивы, затем отформатировать и объединить их, как вы хотите, в массив без ячеек.Если в Matlab нет встроенной функции карты, это может быть связано с соображениями эффективности. В вашей реализации вы используете цикл для перебора элементов списка, что обычно не одобряется в мире Matlab. Большинство встроенных функций Matlab являются «векторизованными», то есть более эффективно вызывать функцию для всего массива, чем выполнять итерацию по нему самостоятельно и вызывать функцию для каждого элемента.
Другими словами, это
намного быстрее, чем это
предполагая ваше определение карты.
источник
В этом нет необходимости,
map
поскольку скалярная функция, которая применяется к списку значений, применяется к каждому из значений и, следовательно, работает аналогичноmap
. Просто попробуйВ вашем конкретном случае вы даже можете написать
источник
Векторизация решения, как описано в предыдущих ответах, вероятно, лучшее решение для скорости. Векторизация тоже очень Matlaby и приятная.
С учетом сказанного у Matlab теперь есть класс контейнера Map.
См. Http://www.mathworks.com/help/matlab/map-containers.html
источник
cellfun
Е. И др., А не о хеш-таблицах или парах ключ-значение.