Given lists of unequal lengths, I want to add them together element-wise, treating missing elements as zero. For example, {1, 2, 3} + {a, b} + {x}
should give {1 + a + x, 2 + b, 3}
.
How do I write a function to do this?
Plus @@ PadRight[{{1, 2, 3}, {a, b}, {x}}]
I think it can also work.
You can simply do a ragged transpose and then add, which saves you the trouble of having to pad the lists:
Total /@ Flatten[{{1, 2, 3}, {a, b}, {x}}, {2}]
(* {1 + a + x, 2 + b, 3} *)
Total[Flatten[{{1, 2, 3}, {a, b}, {x}}, {2}], {2}]
$\endgroup$
Commented
Apr 11, 2013 at 12:45
Using raggedMapThread
from this answer we could write:
raggedMapThread[Plus, {{1, 2, 3}, {a, b}, {x}}]
{1 + a + x, 2 + b, 3}
This is can also be easily extended to additional dimensions:
raggedMapThread[Plus, {{{1}, {2, 3}}, {{a, b}, {q}}, {{x}}}, 2]
{{1 + a + x, b}, {2 + q, 3}}
Again for reference the code is:
raggedMapThread[f_, expr_, level_Integer: 1] :=
Apply[f, Flatten[expr, List /@ Range[2, level + 1]], {level}]
fadd[a_, b_] := (PadRight[a, Length@b] + b) /; Length[b] > Length[a]; fadd[a_, b_] := (PadRight[b, Length@a] + a) /; Length[a] > Length[b]
should work. This can be modified for more than two lists. $\endgroup$