gpt4 book ai didi

wolfram-mathematica - Do/Return 在 Compile 中表现不同——为什么?

转载 作者:行者123 更新时间:2023-12-04 05:41:51 24 4
gpt4 key购买 nike

我想知道这是错误还是记录在案的行为?

f1 = Function[v, 
Do[If[v[[i]] < 0, Return[v[[i]]]], {i, 1, Length[v]}]]

c1 = Compile[{{v, _Integer, 1}},
Do[If[v[[i]] < 0, Return[v[[i]]]], {i, 1, Length[v]}]]

将它们应用于不包含负数的列表时,我们得到不同的结果:
In[66]:= Through[{f1, c1}[{1, 2, 3}]]

Out[66]= {Null, 3}

当我尝试编译 short function 时,这导致了一个错误。 (实际上是它的修改版本)。
Do单独不显示问题:
c2 = Compile[{}, Do[i, {i, 5}]]

c2[] (* returns nothing, as expected *)

最佳答案

正如@Pillsy 和@Leonid 的回答所指出的,问题是原始函数有时会返回 Null有时是整数。相反,编译后的函数总是返回一个整数。在 V8 中,我们可以使用 CompilePrint 看到这一点。 :

Needs["CompiledFunctionTools`"]
CompilePrint @
Compile[{{v,_Integer,1}},Do[If[v[[i]]<0,Return[v[[i]]]],{i,1,Length[v]}]]

在 V8.0.4 下,产生以下结果:
        1 argument
1 Boolean register
6 Integer registers
1 Tensor register
Underflow checking off
Overflow checking off
Integer overflow checking on
RuntimeAttributes -> {}

T(I1)0 = A1
I3 = 0
I0 = 1
Result = I5

1 I2 = Length[ T(I1)0]
2 I4 = I3
3 goto 10
4 I5 = Part[ T(I1)0, I4]
5 B0 = I5 < I3
6 if[ !B0] goto 10
7 I5 = Part[ T(I1)0, I4]
8 goto 11
9 goto 10
10 if[ ++ I4 < I2] goto 4
11 goto 12
12 Return

我们可以看到编译函数的结果是整数寄存器 I5 中的任何内容。 .按照反编译指令的流程,我们看到如果没有匹配,则 I5将最终包含列表的最后一个元素。

编译器的行为可能会在 Mathematica 的不同版本之间发生变化。我认为在返回结果类型不明确的情况下,编译器至少应该发出警告是合理的。

关于wolfram-mathematica - Do/Return 在 Compile 中表现不同——为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8184548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com