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 want to use concise code to generate a table of values that list the addition of a set of vectors. What I am looking for is essentially a Table of Tables.

I will show here the kind of lists I want, which I am able to generate individually.

First, let's define a set of say 6 vectors (an ordered pair):

H = Table[{Cos[n*Pi/3], Sin[n*Pi/3]}, {n, 0, 5, 1}];

This will be our first Table. Next, I want to get all vectors that result from adding any two vectors in H together:

H2 = Table[H[[i1]] + H[[i2]], {i1, 1, 6, 1}, {i2, 1, 6, 1}];

Now we create another Table, but this time with all vectors that result from choosing three vectors from the set H and adding them together:

H3 = Table[H[[i1]] + H[[i2]] + H[[i3]], {i1, 1, 6, 1}, {i2, 1, 6, 1}, {i3, 1, 6, 1}];

Suppose we were to continue creating tables like this with arbitrarily many sums of this type. How can I create one single Table that would combine them all?

I am aware that I can use some function like Append to join them all together after each one has been generated, but I am looking for something more efficient that can be done a single cell.

I have something in mind along the following lines (note that this is not properly functioning code, but I am writing it for illustrative purposes). It would be nice to be able to generalize these Tables using something like this, where I've attempted to index the variables (incorrectly?):

H[N_] = 
Table[
Sum[ H[[i_j]] , {j, 1, N, 1}],
{i_1, 1, 6, 1}, {i_2, 1, 6, 1}, ... {i_N, 1, 6, 1}] ;

Then I could create a single table with say 10 iterations using:

Table[ H[N],{N,1,10,1}]

Unfortunately, I am unable to index variables in this way because Mathematica tells me the variable names are "Protected". How can I get around this?

share|improve this question
add comment

2 Answers

up vote 5 down vote accepted

I wasn't sure exactly what terms were included in your summations - here are some ideas though:

Define h[1] = Table[{Cos[n*Pi/3], Sin[n*Pi/3]}, {n, 0, 5, 1}]; as you have.

Then try h[k_] := Plus @@@ Tuples[h[1], k] if the sums you are referring to can include the same element multiple times, or try h[k_] := Plus @@@ Subsets[h[1], {k}]if you're summing over distinct terms only.

share|improve this answer
    
@Nasser you don't need Function: Total /@ ... will do. –  Mr.Wizard Dec 25 '12 at 4:53
    
@Nasser thanks for the tip! That's a significant difference indeed. Interesting that Total/@data is noticeably faster than Apply[Plus,#]&/@data, too. Is there a more general key point to take away from this? I'm not sure I understand exactly why there's such a speed difference. –  Royce Dec 25 '12 at 10:46
add comment

Using

  H = Table[{Cos[n*Pi/3], Sin[n*Pi/3]}, {n, 0, 5, 1}];

define

 hF[n_] := With[{arg1 = ConstantArray[H, n], dims = Join[ConstantArray[6, n], {2}]},
  ArrayReshape[Tuples[\[FormalA][Sequence @@ arg1]] /. \[FormalA] -> Plus, dims]]

Usage:

 hF[1]
 (* {{1, 0}, {1/2, Sqrt[3]/2}, {-(1/2), Sqrt[3]/2}, {-1, 0}, 
      {-(1/2), -(Sqrt[3]/2)},   {1/2, -(Sqrt[3]/2)}} *)

 hF[2] == H2
 (* True *)

 hF[3] == H3
 (* True *)
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.