Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have a list $(d_1, d_2, .. d_k)$ and I want to create all sums that I get for adding only two elements for my list $(d_1+d_2, d_1+d_3,...d_{k-1}+d_k)$. The RotateLeft function gives me only some of my sums and I need all of them.

share|improve this question
3  
Welcome to Mathematica.SE! I see that you have been given a lot of answers to your 3 questions, but you did not accept any as most helpful. Please, when you see good Q&A, vote them up by clicking the gray triangles, because the credibility of the system is based on the reputation gained by users sharing their knowledge. ALSO, remember to accept the answer, if any, that solves your problem, by clicking the checkmark sign - thanks! –  Vitaliy Kaurov Sep 4 '12 at 15:09
add comment

6 Answers

Something like :

data = {a, b, c, d}; 

Flatten[Table[data[[i]] + data[[j]], {i, 1, Length[data] - 1}, {j, i + 1, Length[data]}],1]

(* {a + b, a + c, a + d, b + c, b + d, c + d} *)

Alternatively (plus suggestion from @Oleksandr R.) :

Total /@ Subsets[data, {2}]

And just because RotateLeft was mentioned :

Union[Flatten[Total /@ Subsets[NestList[RotateLeft[#] &, data, Length[data] - 1], {2}], 1]]
share|improve this answer
    
The third one seems a memory hog :) –  belisarius Sep 4 '12 at 14:52
add comment
l = {a, b, c, d};
Plus @@@ Subsets[l, {2}]
(*
  {a + b, a + c, a + d, b + c, b + d, c + d}
*)

edit

Some timings

Mathematica graphics

share|improve this answer
add comment

Just to show that there's more than one way to do things in Mathematica:

test = {a, b, c, d, e};
Total /@ (Join @@ MapIndexed[Drop[#1, First[#2]] &,
          Outer[List, test, test]])
   {a + b, a + c, a + d, a + e, b + c, b + d, b + e, c + d, c + e, d + e}

Of course, Oleksandr's and Verde's suggestions are the more compact way of going about it.

share|improve this answer
add comment

Come downvote @Verde

l = {a, b, c, d}

l~Subsets~{2}~Total~{2}
share|improve this answer
    
(deleted comment) –  belisarius Sep 4 '12 at 12:41
1  
This one is six times faster than the Plus @@@ solution, twice as fast as the Outer solution, and three times faster than the Table solution. –  whuber Sep 4 '12 at 12:50
    
And ten times slower than Total /@ Subsets[l, {2}] –  belisarius Sep 4 '12 at 13:39
2  
@whuber l = RandomReal[1, 10^3]; {(Timing@(l~Subsets~{2}~Total~{2}))[[1]], (Timing[ Plus @@@ Subsets[l, {2}]])[[1]]} -> {2.89, 0.547} ... –  belisarius Sep 4 '12 at 13:43
    
@Verde You're right: that's astounding, given how similar the Total /@ and ~Total~2 constructs are!. –  whuber Sep 4 '12 at 14:34
show 1 more comment
l = {a, b, c, d};

Let's make use of pattern matching ( even though there are faster methods especially for list manipulations) :

ReplaceList[ l, {___, x_, ___, y_, ___} -> x + y]
{a + b, a + c, a + d, b + c, b + d, c + d}   

Typically, efficiency of pattern matching solutions is worse than that of functional approach, nevertheless we point out a remarkable feature of the result of ReplaceList: it is identical with other (functional) methods, e.g. (taking a longer list) we have:

ls = {a, b, c, d, e, f, g, h, i, j, k, l, , m, n, o, p, q, r, s};

ReplaceList[ls, {___, x_, ___, y_, ___} -> x + y] == 
Plus @@@ Subsets[ls, {2}] == ls~Subsets~{2}~Total~{2} 
True
share|improve this answer
add comment

Since somebody mentioned timings...

Module[{x = Outer[Plus, l, l]},
 Flatten[x[[#, # + 1 ;;]] & /@ Range[Length@x - 1]]]
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.