【问题标题】:Loop unrolling? in Julia with metaprogramming循环展开?在 Julia 中使用元编程
【发布时间】:2017-01-29 20:39:08
【问题描述】:

有没有办法“元编程”获得具有以下结构的代码块:

if r1 < R1
   s = 1

   elseif r1 < R2
      s = 2

      ... etc until N

   end
end

谢谢!

【问题讨论】:

  • 查看Base.Cartesian.@nif
  • 但是可能还有另一种(更好的?)方法可以实现您想要的。你想做什么?
  • @DavidP.Sanders Hola 再次大卫。 (来自阿根廷的大粉丝)......我想要做的是在这里“总结”:pastebin.com/2qYcBWfR我不想在这里发布所有这些内容以使问题不那么混乱。但是,是的,这基本上是没有真正编程背景的化学工程师学生在这里攻读博士学位时会遇到的问题。感谢您的关注。
  • 你确定你的两段代码做同样的事情吗?在 pastebin 中,您的 sample 函数计算 R 的累积总和,而展开的版本似乎只是直接与 R* 变量进行比较。不同的一点是,调用rand() 实际上成本很高。您可以通过分配块 rand(N) 然后从中提取样本来加快速度。
  • 还有一件事(再次参考 Pastebin 上的代码):在我的笔记本电脑上使用 length(R)=14 运行采样 10^10 次大约需要 4 分钟。你怎么能把它剃掉半个多小时?我认为一定有更多的事情发生。

标签: metaprogramming julia loop-unrolling


【解决方案1】:

查看Base.Cartesian.@nif

我认为这应该适合你...

julia> macroexpand(:(@nif 10 d->(r1 < R_d) d->begin s=d; break end))
:(if r1 < R_1 # REPL[9], line 1:
        s = 1 # REPL[9], line 1:
        break
    else
        if r1 < R_2 # REPL[9], line 1:
            s = 2 # REPL[9], line 1:
            break
        else
            if r1 < R_3 # REPL[9], line 1:
                s = 3 # REPL[9], line 1:
                break
            else
                if r1 < R_4 # REPL[9], line 1:
                    s = 4 # REPL[9], line 1:
                    break
                else
                    if r1 < R_5 # REPL[9], line 1:
                        s = 5 # REPL[9], line 1:
                        break
                    else
                        if r1 < R_6 # REPL[9], line 1:
                            s = 6 # REPL[9], line 1:
                            break
                        else
                            if r1 < R_7 # REPL[9], line 1:
                                s = 7 # REPL[9], line 1:
                                break
                            else
                                if r1 < R_8 # REPL[9], line 1:
                                    s = 8 # REPL[9], line 1:
                                    break
                                else
                                    if r1 < R_9 # REPL[9], line 1:
                                        s = 9 # REPL[9], line 1:
                                        break
                                    else  # REPL[9], line 1:
                                        s = 10 # REPL[9], line 1:
                                        break
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
    end)

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多