2011-10-05 54 views
3

一對列表的元素的產品列表中是否有將採取兩個列表預罐裝操作,說如何從Mathematica中

a = { 1, 2, 3 } 
b = { 2, 4, 8 } 

而產生的,而無需使用一個for循環,一個新的其中每對列表中的相應的元素都被乘以

{ a[1] b[1], a[2] b[2], a[3] b[3] } 

我想有可能列表存在像內部[時代,A,b,再加上],但返回一個列表,而不是總和。

回答

10
a = {1, 2, 3} 
b = {2, 4, 8} 

Thread[Times[a, b]] 

或者,由於Times[]線程逐個元件在列表,簡單地說:

a b 

請注意,這兩個解決方案的效率是不一樣的:

i = RandomInteger[ 10, {5 10^7} ]; 
{First[ Timing [i i]], First[ Timing[ Thread[ Times [i,i]]]]} 

(* 
-> {0.422, 1.235} 
*) 

編輯

的行爲是由於Listable屬性。看看這個:

SetAttributes[f,Listable]; 
f[{1,2,3},{3,4,5}] 
(* 
-> {f[1,3],f[2,4],f[3,5]} 
*) 
+2

另外'a * b',因爲它確實按照元素進行了乘法運算。 – Nayuki

+0

@Nayuki它已經在那裏 –

8

您可以通過使用List作爲最後一個參數做到這一點使用Inner

In[5]:= Inner[Times, a, b, List] 

Out[5]= {2, 8, 24} 

但別人已經提到,Times自動工作。在一般的東西像Inner,這是與「虛擬」功能測試的事情經常有用看到結構是什麼:

In[7]:= Inner[f, a, b, g] 

Out[7]= g[f[1, 2], f[2, 4], f[3, 8]] 

,然後從向後工作,以確定實際的作用應該是得到所需要的是什麼結果。

+0

+1,尤其是對於使用虛擬函數的建議。 – rcollyer