采用向量和标量的函数
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)
完成工作 --- 哪个看起来更干净。
我有一个接受向量的函数
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)
完成工作 --- 哪个看起来更干净。