# Generating an Array of Vectors

I'm working a lot with nested lists of $(x,y)$ coordinates (of a FEM-like mesh, but that's not important), like so:

nodes = { {{0,0}, {0,1}, {0,2}}, {{1,0}, {1,1}, {1,2}} }


This has the nice convenient structure that nodes[[i,j]] gives me the $(x,y)$ coordinates of my "$(i,j)$th" node, so that nodes[[i,j]][] is my $x$ coordinate and nodes[[i,j]][] is my $y$ coordinate. This works nicely for my purposes.

How would I construct a variable size array of this kind using array[] et. al? If I use for instance

nodes = array[array[X,2],{4,4}]


I get a 4-by-4 array where nodes[[i,j]] is of the form {X,X}[1,1]. This is close to what I want, and I could change a bunch of my code to work with this, but I'd rather not - I'd love to have something where nodes[[i,j]] looks like this:

{X[i,j], X[i,j]}


The reason I'd like to do this is I have defined some functions that take an array of nodes as input and computes some quantity, i.e. F[nodes_]:= (*something*), and I'd like to compute derivatives of this function with respect to each of its variables, i.e. $F_{x_i}$ or $F_{y_j}$.

I've tried various things with no success, and I've also tried looking for a similar construct in the documentation and here on SE, but I didn't see anything. Any ideas?

Edit: I had too many square braces in some of my code before. Fixed.

• I'm not quite sure what is it that you want. Does Array[{x[##], x[##]} &, {4, 4}] work for you? Also, shouldn't array be upper case? – seismatica Aug 7 '14 at 0:40

## 2 Answers

A simpler way to give an array whose $(i,j)$ element is {X[i,j], X[i,j]} is to just use Table:

m = 3;
n = 4;
Table[X[i, j][k], {i, m}, {j, n}, {k, 2}]


Output is:

{{{X[1, 1], X[1, 1]}, {X[1, 2], X[1, 2]}, {X[1, 3],
X[1, 3]}, {X[1, 4], X[1, 4]}}, {{X[2, 1],
X[2, 1]}, {X[2, 2], X[2, 2]}, {X[2, 3],
X[2, 3]}, {X[2, 4], X[2, 4]}}, {{X[3, 1],
X[3, 1]}, {X[3, 2], X[3, 2]}, {X[3, 3],
X[3, 3]}, {X[3, 4], X[3, 4]}}}


Is this what you are looking for?

• I'll have to check to see if this works when I'm back at my office tomorrow. – icurays1 Aug 7 '14 at 1:45
• +1 on your answer but I prefer Array for this as: (1) it does not introduce additional Symbols (2) the array dimensions are adjacent e.g. {7, 7, 2} (3) it is easy to enter a list of dimensions, e.g. dims = {4, 4, 2}; Array[X[#, #2][#3] &, dims]. See my answer below. – Mr.Wizard Aug 7 '14 at 4:02

I believe this does what you requested:

nodes = Array[X[#, #2][#3] &, {7, 7, 2}];


Check:

nodes[[2, 3]]
nodes[[5, 4]]
nodes[[7, 1]]

{X[2, 3], X[2, 3]}
{X[5, 4], X[5, 4]}
{X[7, 1], X[7, 1]}