如何从mathematica中的一对列表的元素生成产品列表

时间:2011-10-05 14:29:02

标签: wolfram-mathematica

是否有一个预先固定的操作需要两个列表,比如说

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

并在不使用for循环的情况下生成一个新列表,其中每对列表中的相应元素已成倍增加

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

我在想可能存在像Inner [Times,a,b,Plus]这样的东西,但是返回一个列表而不是一个总和。

2 个答案:

答案 0 :(得分: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}
*)

修改

Times[]的行为归因于Listable属性。看看这个:

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

答案 1 :(得分:8)

您可以使用Inner作为最后一个参数使用List执行此操作:

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]]

然后从那里开始工作,以确定实际功能应该是什么,以提供所需的结果。