Функция карты в MATLAB?

Соедините ваш мобильный телефон с другим Wi-Fi-соединением с другим поставщиком услуг . Это кажется странным, но вы можете попробовать это!

97
задан Will Ness 7 February 2016 в 00:47
поделиться

4 ответа

Краткий ответ: встроенная функция arrayfun делает именно то, что ваша функция map делает для числовых массивов:

>> y = arrayfun(@(x) x^2, 1:10)
y =

     1     4     9    16    25    36    49    64    81   100

Есть два других встроенные функции, которые ведут себя аналогично: cellfun (который работает с элементами массива ячеек) и structfun (который работает с каждым полем структуры).

Однако эти функции часто не нужны, если вы пользуетесь преимуществами векторизации, в частности, с помощью поэлементных арифметических операторов . Для приведенного вами примера векторизованное решение будет выглядеть следующим образом:

>> x = 1:10;
>> y = x.^2
y =

     1     4     9    16    25    36    49    64    81   100

Некоторые операции будут автоматически работать с элементами (например, добавление скалярного значения к вектору), в то время как другие операторы имеют специальный синтаксис для поэлементных операций (обозначается ]. перед оператором).

130
ответ дан 24 November 2019 в 05:28
поделиться

В дополнение к векторным и поэлементным операциям существует также cellfun для сопоставления функций с массивами ячеек. . Например:

cellfun(@upper, {'a', 'b', 'c'}, 'UniformOutput',false)
ans = 
    'A'    'B'    'C'

Если 'UniformOutput' истинно (или не предоставлено), он попытается объединить результаты в соответствии с размерами массива ячеек, поэтому

cellfun(@upper, {'a', 'b', 'c'})
ans =
ABC
10
ответ дан 24 November 2019 в 05:28
поделиться

Если Matlab не имеет встроенной функции отображения, это могло быть связано с соображениями эффективности. В вашей реализации вы используете цикл для перебора элементов списка, что обычно не одобряется в мире Matlab. Большинство встроенных функций Matlab являются "векторизованными", т.е. более эффективно вызывать функцию для всего массива, чем выполнять итерацию по нему самостоятельно и вызывать функцию для каждого элемента.

Другими словами, this


a = 1:10;
a.^2

намного быстрее, чем этот


a = 1:10;
map(@(x)x^2, a)

, если принять ваше определение карты.

0
ответ дан 24 November 2019 в 05:28
поделиться

You don't need map since a scalar-function that is applied to a list of values is applied to each of the values and hence works similar to map. Just try

l = 1:10
f = @(x) x + 1

f(l)

In your particular case, you could even write

l.^2
0
ответ дан 24 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: