4

是否有一个预先准备好的操作需要两个列表,比如说

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] 这样的东西,但返回一个列表而不是一个总和。

4

2 回答 2

13
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]}
*)
于 2011-10-05T14:37:06.853 回答
9

您可以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]]

然后从那里向后工作以确定实际功能应该是什么才能给出所需的结果。

于 2011-10-05T15:22:47.983 回答