我将一些代码从R移植到julia以熟悉该语言,并且我发现了一些不能平滑转换的模式。考虑下面的函数,在茱莉亚合并repmat和转置
# Ricatti-Bessel and derivatives up to nmax, vectorised over x
function rb(x, nmax)
n = 1:nmax
nu = 0.5 + [0, n]
bj = hcat([besselj(nu, _x) for _x in x]...).'
#^first question^
sq = repmat(sqrt(pi/2*x), 1, nmax+1)
bj .*= sq
xm = repmat(x, 1, nmax)
nm = repmat(n', length(x), 1)
#^second question^
dpsi = bj[:,n] - nm .* bj[:,n+1] ./ xm
psi = bj[:,n+1]
return psi, dpsi # it'd be nice to return a "named list" instead
end
# rb(1:5,3)
第一个问题:这是获得使用
besselj()
n最大列长度(X)列的矩阵的最佳方式?在找到一种可行的模式之前,我不得不挠挠头。第二个问题:我发现自己经常不得不转换对象,在repmat中和/或在repmat之外,有没有其他方法可以指定输出大小和填充方向(按行还是在col-wise)?
也许我采取了错误的做法与整个事情:我使用矢量化功能(以R,和Matlab的老人回忆)的工作,因为他们通常是快速的最短路线线性代数的例程。 保持x是一个标量,并且只在最高级别循环会更有意义吗?我担心通过这样做,我将无法利用BLAS等的快速矩阵/矢量函数,并基本上将它们重写在茱莉亚中,更不用说可读性明显下降了。 我应该强调我对最佳性能感兴趣,因为这个函数将在很多次内部被调用,对于x的许多值。
非常感谢提示,我会更详细地通读这一点。尽管如此,一个快速的后续:'besselj()'被关于它的第一个参数被矢量化了,对nu进行迭代是不是有点浪费? – baptiste 2015-03-02 06:41:53
没有浪费,除非besselj在论据之间分享一些东西。 Julia中的大多数矢量化函数只是一个for循环版本的标量函数 - 事实上,它已被提议删除它们,以使其更明显,因为它有点像MATLAB – IainDunning 2015-03-02 06:54:32
的宿醉模式。实际上,您可以看到源代码https://github.com/JuliaLang/julia/blob/master/base/special/bessel.jl,实际上它只是使用'@ vectorize_1arg'生成一个矢量化版本。 – IainDunning 2015-03-02 06:58:33