采用向量和标量的函数

Function taking Vectors and Scalars

我有一个接受向量的函数

function foo(x::Vector{Int64})
    x
end

如何让它也适用于标量(即将它们变成单元素向量)?

我知道我可以做到:

foo(x::Int64) = foo([x])

但是当有更多参数时,这就不再酷了,因为您正在编写多个方法来实现一件事。

我想我有点像 foo(x::Union{Int64, Vector{Int64}}),但我不知道它在哪里或如何工作,或者它是否是正确的做法。

有人能帮忙吗?

出现这种情况的主要时间是,如果您的向量函数版本对它的所有元素执行相同的操作。在这种情况下,您要做的是定义 f(x::Int),并使用广播 f.([1,2,3]) 作为向量案例。

您可以制作一个辅助函数,它要么进行转换,要么什么都不做。那么主函数可以接受任意组合:

_vec(x::Number) = [x]
_vec(x::AbstractVector) = x

function f(x, y, z)  # could specify ::Union{Number, AbstractVector}
  xv = _vec(x)
  yv = _vec(y)
  ...
end

... 可以完成实际工作,或者可以调用 f(xv, yv, zv) 另一个方法 f(x::AbstractVector, y::AbstractVector, z::AbstractVector) 完成工作 --- 哪个看起来更干净。