Простой способ выполнить вычисления для каждого элемента вектора с каждым из элементов этого вектора

#julia #sapply

#julia #sapply

Вопрос:

Например, для каждого элемента вектора я хочу вычислить сумму остатков с другими элементами этого вектора. Это работает правильно для одного элемента:

 a = [1, 2, 5, 7, 8, 22]
f(x) = sum(abs.(x .- a))
f(2)
Out: 35
  

Но если применить эту функцию ко всем элементам с помощью map(), Julia вернет ошибку:

 map(a, f)
Out: "MethodError: no method matching iterate(::typeof(f))"
  

В R это очень легко получить с помощью sapply():

 a = c(1, 2, 5, 7, 8, 22)
sapply(a, function(x) sum(abs(x - a)))
Out: 39 35 29 29 31 87
  

Есть ли столь же элегантный способ сделать это в Julia?

Комментарии:

1. Подводя итог приведенным ниже ответам: в Julia есть не менее элегантный способ сделать это, но и более элегантный способ 🙂

Ответ №1:

Просто векторизируйте f :

 julia> f.(a)
6-element Array{Int64,1}:
 39
 35
 29
 29
 31
 87
  

Ответ №2:

Функция map принимает функцию, которую она применяет к коллекции, в качестве своего первого аргумента. Т.е. вы можете написать

 map(f, a)
  

Ответ №3:

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

 julia> map(a) do x
       sum(abs.(x .- a))
       end
6-element Array{Int64,1}:
 39
 35
 29
 29
 31
 87