在 2 个数组上广播函数时出现 DimensionMismatch 或 MethodError

DimensionMismatch or MethodError when broadcasting a function over 2 arrays

我尝试创建一个(有点)行为类似于 excel 中的 vlookup() 的函数,具有以下参数

function foo(val::Float64, table::AbstractArray, col::Int64)
    return table[findfirst(x->val<=x, table[:,1]), 2]
end

假设我有一个 table 数组,看起来像

arr = 4x2 Matrix{Any}:
0.26 | "string1"
0.60 | "string2"
0.73 | "string3"
1.00 | "string4"

当我 运行 这个函数只有一个 Float64 作为参数时,它工作:

julia> foo(rand(), arr, 2)
"string3"

但是当使用点广播应用于 Float64 数组时,出现以下错误

julia> foo.(rand(3), arr, 2)
DimensionMismatch("arrays could not be broadcast to a common size; got a dimension with lengths 3 and 4")
julia> foo.(rand(4), arr, 2)
MethodError: no method matching foo(::Float64, ::Float64, ::Int64)

我该如何解决这个问题?

您可以使用 Ref 在广播时将值视为标量:

julia> arr = [rand(4);; ["a", "b", "c", "d"]]
4×2 Matrix{Any}:
 0.866715   "a"
 0.0901788  "b"
 0.385088   "c"
 0.404498   "d"

julia> foo.(rand(3), Ref(arr), Ref(2))
3-element Vector{String}:
 "a"
 "a"
 "a"