【教程】怎样编译/编译的通用规则/学会这6条,你也会编译
mathematica吧
全部回复
仅看楼主
吧务
level 15
xzcyr 楼主
这个关于编译(Compile)的帖子我也算构思了满久了,不过还是不敢说已经定了稿,为了便于修订并避免链接的迅速报废,这次尝试着放在了有道云笔记上,大家多点一下鼠标吧:
http://note.youdao.com/share/?id=bf2a031f7d0d69064941032c7857dfd1&type=note
2016年01月02日 14点01分 1
level 8
辛苦了,看完我都觉得累,写完估计得来回好几天。。
2016年03月19日 07点03分 2
吧务
level 12
mma10,4中好像ReplacePart不能编译了 还有要补充一下Total和Evaluate都可以编译
2016年05月30日 15点05分 5
上WolframCloud试了一下,ReplacePart依旧可编译,你是不是漏看了我在原则三里写的问题?Total的问题在我看来属于特例,并且它也已经在我在原则一中所链的那帖里提及了所以就没有再提。Evaluate不能编译,最简单的例子:cf = Compile[{}, Module[{a}, a = Evaluate@2]];
2016年06月04日 02点06分
你的Evaluate八成是位于Compile第二参数的最外层,也就是形如Compile[{a}, Evaluate[a + 1 + 1]]的情况,这种情况只是用Evaluate改了计算次序而已,Evaluate并没有被编译。
2016年06月04日 02点06分
level 12
之前尝试过在 Compile 内部自定义函数,但是不行,说是因为有 SetDelayed (但是 SetDelayed 明明就出现在了 Compile`CompilerFunctions[] // Sort 的结果列表里);但是后来发现配合 Evaluate 就可以编译了。用 CompilePrint 也没发现有 MainEvaluate。
请问,这个情况如何理解?
2017年12月02日 12点12分 8
回复太长了,而且楼中楼老出问题,就在10楼单回了一楼。
2017年12月02日 13点12分
吧务
level 15
xzcyr 楼主
1. SetDelayed说实话我没有详细探索过,但它应该也属于虽可编译但高度受限的情况。这里可以提供一个例子:
Compile[{b}, With[{a := 1}, b + a]] // CompilePrint
2. 这个其实我在你之前在SE的某答案下面也解释过一遍,并不是Evaluate让代码可编译了,而是Evaluate使得那段代码在被Compile“接手”前进行了计算,而计算生成的表达式又恰好可以编译。比如,
Compile[{x, y}, Evaluate@EuclideanDistance[{x, y}, {1, 2}]] // CompilePrint
其实是等效于将
Compile[{x, y}, EuclideanDistance[{x, y}, {1, 2}]]
的
EuclideanDistance[{x, y}, {1, 2}]
部分选中然后Ctrl+Shift+Enter,也就是说,Compile接收到的只是
Sqrt[Abs[-1 + x]^2 + Abs[-2 + y]^2]
一个与使用Evaluate效果相当的做法是使用纯函数 Compile[{x, y}, #] &[EuclideanDistance[{x, y}, {1, 2}]]
原理当然也是一样的:调节计算次序,突破Compile的HoldAll属性。关于这个,其实可以参考这帖:
https://tieba.baidu.com/p/4886024974 ——其实,我早想动笔却一直没写的《计算次序杂谈》的核心部分可以说就在这帖里。
2017年12月02日 13点12分 10
level 7
楼主你的链接打开需要密码
2019年03月29日 11点03分 11
有道云前些天抽风了。现在已恢复。
2019年04月06日 07点04分
level 1
学到了很多,给楼主点赞![大拇指]
2020年09月18日 03点09分 13
1