小编Jes*_*del的帖子

在Mathematica中,如何为任意数量的参数编译函数Outer []?

如果我想从两个列表中找到所有可能的和list1list2,我用的是Outer[]函数的规格Plus为合并算:

In[1]= list1 = {a, b}; list2 = {c, d}; Outer[Plus, list1, list2]

Out[1]= {{a + c, a + d}, {b + c, b + d}}

如果我希望能够处理任意数量的列表,请列出列表,

In[2]= listOfLists={list1, list2};

那么我知道如何找到所有可能的总和的唯一方法是使用Apply[]函数(有简写@@)以及Join:

In[3]= argumentsToPass=Join[{Plus},listOfLists]

Out[3]= {Plus, {a, b}, {c, d}}

In[4]= Outer @@ argumentsToPass

Out[4]= {{a + c, a + d}, {b + c, b + d}}

或者干脆

In[5]= Outer @@ Join[{Plus},listOfLists]

Out[5]= {{a + c, a …

wolfram-mathematica compilation

8
推荐指数
1
解决办法
2800
查看次数

Mathematica中两个奇怪的效率问题

第一个问题

我有时间计算以下语句需要多长时间(其中V [x]是一个耗时的函数调用):

Alice     = Table[V[i],{i,1,300},{1000}];
Bob       = Table[Table[V[i],{i,1,300}],{1000}]^tr;
Chris_pre = Table[V[i],{i,1,300}];
Chris     = Table[Chris_pre,{1000}]^tr;
Run Code Online (Sandbox Code Playgroud)

爱丽丝,鲍勃和克里斯是相同的基质,计算3种略有不同的方式.我发现Chris的计算速度比Alice和Bob快1000倍.

Alice计算速度慢1000倍并不奇怪,因为天真地,函数V必须比计算Chris时多被调用1000次.但令人非常惊讶的是,Bob的速度非常慢,因为除了Chris存储中间步骤Chris_pre之外,他的计算方式 Chris完全相同.

鲍勃为什么评价这么慢?


第二个问题

假设我想在表单的Mathematica中编译一个函数

f(x)=x+y
Run Code Online (Sandbox Code Playgroud)

其中"y"是在编译时固定的常量(但我不希望在代码中直接替换它的数字,因为我希望能够轻松地更改它).如果y的实际值是y = 7.3,我定义

f1=Compile[{x},x+y]
f2=Compile[{x},x+7.3]
Run Code Online (Sandbox Code Playgroud)

然后f1比f2慢50%.当编译f1时,如何使Mathematica将"y"替换为"7.3",以便f1以f2的速度运行?


编辑:

我找到了第二个问题的一个丑陋的解决方法:

f1=ReleaseHold[Hold[Compile[{x},x+z]]/.{z->y}]
Run Code Online (Sandbox Code Playgroud)

肯定有更好的办法...

optimization performance wolfram-mathematica compilation

5
推荐指数
1
解决办法
1306
查看次数