【发布时间】:2017-03-09 08:15:52
【问题描述】:
这是我与 Julia 一起学习和实验的第二天。尽管我仔细阅读了有关元编程的文档(但可能不够仔细)和几个类似的线程。我仍然不知道如何在函数中使用它。 我试图使以下功能更灵活地模拟一些数据:
using Distributions
function gendata(N,NLATENT,NITEMS)
latent = repeat(rand(Normal(6,2),N,NLATENT), inner=(1,NITEMS))
errors = rand(Normal(0,1),N,NLATENT*NITEMS)
x = latent+errors
end
通过这样做:
using Distributions
function gendata(N,NLATENT,NITEMS,LATENT_DIST="Normal(0,1)",ERRORS_DIST="Normal(0,1)")
to_eval_latent = parse("latent = repeat(rand($LATENT_DIST,N,NLATENT), inner=(1,NITEMS))")
eval(to_eval_latent)
to_eval_errors = parse("error = rand($ERRORS_DIST,N,NLATENT*NITEMS)")
eval(to_eval_errors)
x = latent+errors
end
但是由于 eval 在本地范围内不起作用,所以它不起作用。我能做些什么来解决这个问题?
也是原来的功能,好像没那么快,是不是我在性能方面犯了什么大错?
我真的很欣赏任何建议。 提前致谢。
【问题讨论】:
-
将分布作为参数传递有什么问题?使用
eval似乎过于复杂。 -
@phg 看起来并不过分复杂,确实如此。代码最初来自 R 脚本,这或多或少是必要的。你知道为什么重复这么慢吗?它是一个 BLAS,所以它应该像闪电一样快,它是功能中最慢的部分。
标签: scope metaprogramming julia