如果我想從兩個列表list1
和list2
找到所有可能的和,我用的是Outer[]
功能與Plus
說明書中作爲合併算:在Mathematica中,如何爲任意數量的參數編譯函數Outer []?
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 + d}, {b + c, b + d}}
問題是當我嘗試編譯:
In[6]= Compile[ ..... Outer @@ Join[{Plus},listOfLists] .... ]
Compile::cpapot: "Compilation of [email protected]@Join[{Plus},listOfLists]] is not supported for the function argument Outer. The only function arguments supported are Times, Plus, or List. Evaluation will use the uncompiled function. "
的事情是,我上午用一根S支持的功能,即Plus
。這個問題似乎只與Apply[]
函數有關。因爲如果我把它列出來固定數量的外加在一起,它工作正常
In[7]= Compile[{{bob, _Integer, 1}, {joe, _Integer, 1}}, Outer[Plus, bob, joe]]
Out[7]= CompiledFunction[{bob, joe}, Outer[Plus, bob, joe],-CompiledCode-]
,但只要我用Apply
,它打破
In[8]= Compile[{{bob, _Integer, 1}, {joe, _Integer, 1}}, Outer @@ Join[{Plus}, {bob, joe}]]
Out[8]= Compile::cpapot: "Compilation of [email protected]@Join[{Plus},{bob,joe}] is not supported for the function argument Outer. The only function arguments supported are Times, Plus, or List. Evaluation will use the uncompiled function."
所以我的問題是:有沒有辦法來規避這個錯誤,或者,一種方法來計算從編譯函數中的任意數量的列表中拉出的元素的所有可能的總和?
(另外,我不知道,如果「彙編」是一個合適的標籤。請指教。)
非常感謝。
關於您期望使用多少個列表以及多長時間?根據答案,編譯可能不是執行此操作的最快方法。 – joebolte 2011-02-12 00:14:59