Add a vector to a list of vectors

What is the syntax to add a vector v1 to each vector in a list of vectors v2?

I know it has to be simple, but I really have searched and not found it.

v1 = {a, b, c}
v2 = {{d, e, f}, {g, h, i}, {j, k, l}}


i.e., sum them in a way to give:

{{a + d, b + e,c + f}, {a + g, b + h, c + i}, {a + j, b + k, c + l}}

• Just for fun: {v1,v1,v1}+v2 Sep 19 '20 at 13:55

I recommend using Transpose twice since it is more efficient than other approaches. Moreover Plus has the Listable attribute, thus one need not map Plus over a list (vector).

Transpose[v1 + Transpose[v2]]

{{a + d, b + e, c + f}, {a + g, b + h, c + i}, {a + j, b + k, c + l}}


Having said that remember that one can rewrite it very concisely in the Front-End: Esc tr Esc :

• Hah, clearly my knowledge of Inner isn't well enough entrenched yet. I failed to notice that my Inner effectively simplified to Transpose @* Plus! Sep 19 '15 at 22:28
• @ciao Thanks, unfortunately someone unupvoted my answer (it was edited) so I guess it is inadvisable to improve posts. Sep 20 '15 at 0:23
• @Artes Of course it is advisable to improve posts! Sep 20 '15 at 18:24
• In similar contexts ... While I use Transpose all the time - for intuitive clarity and readability, sometimes one can get faster performance using Part and All in its place ... just FYI testData = Table[{{i, 2 i}, 3 i}, {i, 1000000}]; Print@Timing[ Length[ Last[ Transpose[testData]]]]; Print@Timing[ Length[ Part[ testData, All, 2]]]; Print@Timing[ Length[ testData[[ All, 2]]]]; Sep 23 '15 at 13:32

To achieve what you need requires to distribute the sum over v2:

(v1 + # &) /@ v2


which is a short form of:

Map[ v1 + # &, v2 ]

• This is a good one for my list of "expressions that help me understand mathematica syntax"! Thanks. Sep 19 '15 at 22:17

Alternative method using the magic that is Inner:

Inner[Plus, {a, b, c}, Transpose@{{d, e, f}, {g, h, i}, {j, k, l}}, List]


Also:

Plus @@@ Thread[{v1, v2}, List, {2}]


TranslationTransform[v1] /@ v2

• More terse and universal version: TranslationTransform[v1][v2]. Oct 12 '15 at 13:39
• This function is for that purpose by far the slowest solution ...
– mrz
May 27 '16 at 21:10

Using Outer is also an efficient approach, in some cases faster than using Transpose twice, the undocumented function StatisticsLibraryMatrixRowTranslate may be the fastest

v1 = RandomReal[1, 10^5];
v2 = RandomReal[1, {10^3, 10^5}];

r1 = Transpose[v1 + Transpose[v2]]; // RepeatedTiming
r2 = Outer[Plus, {v1}, v2, 1][[1]]; // RepeatedTiming
r3 = Block[{res=v2}, StatisticsLibraryMatrixRowTranslate[res, v1]; res]; // RepeatedTiming

r1===r2===r3


Output

{0.541983, Null}
{0.446791, Null}
{0.241258, Null}
True

Total[Tuples[{{v1}, v2}], {2}]

 {{a + d, b + e, c + f}, {a + g, b + h, c + i}, {a + j, b + k, c + l}}

Distribute[{{v1}, v2}, List, List, List, Plus]

 {{a + d, b + e, c + f}, {a + g, b + h, c + i}, {a + j, b + k, c + l}}