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
进行平方操作,但不想每次都写一个循环来执行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
这种做法看起来很合理,但是我使用参数化类型会使我的代码运行速度和避免使用参数化类型的情况一样快吗?
总之,我的问题分为两个部分:
1. 如果快速代码对我很重要,我应该像上面描述的那样使用参数化类型,还是应该为不同的具体类型编写多个版本?或者我应该完全采用其他方法?
2. 当我想要一个可以操作数组和标量的函数时,是否编写两个版本的函数,一个用于标量,另一个用于数组,是良好的实践?或者我应该完全采用其他方法?
最后,请指出您认为以上代码中的任何其他问题,因为我的最终目标是编写优秀的Julia代码。
mysquare{T<:Number}(x::T)
而不是mysquare(x::Number)
? - Adobe@vectorize_1arg
,而现在应使用.
符号。 - Chris Rackauckas