【问题标题】:A simple way to perform calculations for every element of the vector with each of elements of this vector使用该向量的每个元素对向量的每个元素执行计算的简单方法
【发布时间】:2020-09-21 15:16:38
【问题描述】:

例如,对于向量的每个元素,我想计算残差与该向量的其他元素的总和。这适用于一个元素:

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 中是否有同样优雅的方式来做到这一点?

【问题讨论】:

  • 总结以下答案:在 Julia 中有一种同样优雅的方式来做到这一点,但也是一种优雅的方式:)

标签: julia sapply


【解决方案1】:

只需对f进行矢量化:

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

【讨论】:

    【解决方案2】:

    函数map 将应用于集合的函数作为其第一个参数。 IE。你可以写

    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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多