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

Pee*_*oot 3 wolfram-mathematica

比方说,是否有一个预制的操作需要两个列表

a = { 1, 2, 3 }
b = { 2, 4, 8 }
Run Code Online (Sandbox Code Playgroud)

并且在不使用for循环的情况下生成新列表,其中每对列表中的对应元素已被乘以

{ a[1] b[1], a[2] b[2], a[3] b[3] }
Run Code Online (Sandbox Code Playgroud)

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

Dr.*_*ius 10

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

Thread[Times[a, b]]
Run Code Online (Sandbox Code Playgroud)

或者,因为Times[]线程元素在列表上,简单地说:

a b
Run Code Online (Sandbox Code Playgroud)

请注意两种解决方案的效率不一样:

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

(*
-> {0.422, 1.235}
*)
Run Code Online (Sandbox Code Playgroud)

编辑

行为Times[]是由Listable属性引起的.看这个:

SetAttributes[f,Listable];
f[{1,2,3},{3,4,5}]
(*
-> {f[1,3],f[2,4],f[3,5]}
*)
Run Code Online (Sandbox Code Playgroud)

  • 也是'a*b`,因为它确实是元素乘法. (2认同)

Bre*_*ion 8

你可以Inner使用Listas作为最后一个参数:

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

Out[5]= {2, 8, 24}
Run Code Online (Sandbox Code Playgroud)

但正如其他人已经提到的那样,Times自动运作 通常对于类似Inner的东西,使用"虚拟"函数测试事物通常很有用,以查看结构是什么:

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

Out[7]= g[f[1, 2], f[2, 4], f[3, 8]]
Run Code Online (Sandbox Code Playgroud)

然后从那里开始工作,以确定实际功能应该是什么,以给出期望的结果.