OP 更新:请注意,在最新版本的 Julia (v0.5) 中,回答这个问题的惯用方法是定义mysquare(x::Number) = x^2
. 使用自动广播覆盖向量化的情况,即x = randn(5) ; mysquare.(x)
。另请参阅更详细地解释点语法的新答案。
我是 Julia 的新手,并且鉴于我的 Matlab 起源,我在确定如何编写利用多重调度和 Julia 类型系统的“好” Julia 代码时遇到了一些困难。
考虑我有一个提供平方的函数的情况Float64
。我可以这样写:
function mysquare(x::Float64)
return(x^2);
end
有时,我想Float64
在一维数组中对所有 s 进行平方,但不想mysquare
每次都写出一个循环,所以我使用多个调度并添加以下内容:
function mysquare(x::Array{Float64, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
但现在我有时会使用Int64
,所以我写了两个利用多重调度的函数:
function mysquare(x::Int64)
return(x^2);
end
function mysquare(x::Array{Int64, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
这是正确的吗?还是有更符合意识形态的方法来处理这种情况?我应该使用这样的类型参数吗?
function mysquare{T<:Number}(x::T)
return(x^2);
end
function mysquare{T<:Number}(x::Array{T, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
这感觉很明智,但是我的代码会像我避免参数类型的情况一样快速运行吗?
总之,我的问题有两个部分:
如果快速代码对我很重要,我应该使用上述参数类型,还是应该为不同的具体类型编写多个版本?还是我应该完全做其他事情?
当我想要一个对数组和标量进行操作的函数时,编写两个版本的函数是否是一种好习惯,一个用于标量,一个用于数组?还是我应该完全做其他事情?
最后,请指出您可以在上面的代码中想到的任何其他问题,因为我的最终目标是编写好的 Julia 代码。