如果我想从两个列表中找到所有可能的和list1和list2,我用的是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 …
第一个问题
我有时间计算以下语句需要多长时间(其中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)
肯定有更好的办法...