Re: matrices with arbitrary dimensionality

• To: mathgroup at smc.vnet.net
• Subject: [mg76910] Re: matrices with arbitrary dimensionality
• From: "alexxx.magni at gmail.com" <alexxx.magni at gmail.com>
• Date: Wed, 30 May 2007 05:10:47 -0400 (EDT)
• References: <f36ea9\$7tn\$1@smc.vnet.net><f38tn5\$ivf\$1@smc.vnet.net>

```Thanks everybody.
I solved in the following way - with your help - my needs concerning
arbitrary dimension matrices.

Here I generate it, with dim dimensions, and hypercube lateral size =
lspins:

generateArbMat[dim_, lspins_] := Module[{ind},
ind = Map[{#, lspins} &  ,
Map[Unique, Map[FromCharacterCode, 64 + Range[dim]]]];
Apply[Table[0, ##] &, ind]
]

In[301]:= generateArbMat[4, 2]
Dimensions[%]

Out[301]= {{{{0, 0}, {0, 0}}, {{0, 0}, {0, 0}}}, {{{0, 0}, {0,
0}}, {{0, 0}, {0, 0}}}}
Out[302]= {2, 2, 2, 2}

Here is the code for the next neighbors (thank you Ray!), adapted for
periodic boundary conditions:

neighbors[v_List?VectorQ] := Module[{a},
a = Flatten[{v - #, v + #} & /@ IdentityMatrix[Length[v]], 1];
a = a /. 0 -> 1; a = a /. lspins + 1 -> 1;
a
]

Here is the function giving the array of all the matrix indices:

locations[] := Distribute[Table[Range[lspins], {dim}], List]

In[307]:= locations[]  (*  dim=2 and lspins=4 *)

Out[307]= {{1, 1, 1}, {1, 1, 2}, {1, 1, 3}, {1, 2, 1}, {1, 2, 2}, {1,
2, 3}, {1, 3, 1}, {1, 3, 2}, {1, 3, 3}, {2, 1, 1}, {2, 1, 2}, {2, 1,
3}, {2, 2, 1}, {2, 2, 2}, {2, 2, 3}, {2, 3, 1}, {2, 3, 2}, {2, 3,
3}, {3, 1, 1}, {3, 1, 2}, {3, 1, 3}, {3, 2, 1}, {3, 2, 2}, {3, 2,
3}, {3, 3, 1}, {3, 3, 2}, {3, 3, 3}}

To setup the matrix values (e.g. with random values):

f = generateArbMat[d, lspins];
f = f /. 0 :> RandomReal[NormalDistribution[0., 1.]];

Last, to operate on the matrix, e.g. to sum all the f values of the
neighbors of a given location i0:

Apply[Plus, Map[Extract[f, #] &, neighbors[i0]]]

any other suggestion is welcome, thanks!

Alessandro

On 26 Mag, 11:13, Ray Koopman <koop... at sfu.ca> wrote:
> On May 25, 3:38 am, "alexxx.ma... at gmail.com" <alexxx.ma... at gmail.com>
> wrote:
>
>
>
> > Hi there,
> > with V.6.0 I keep on with my experiment in translating a large C++
> > spin simulation program.
>
> > What I'm bouncing my head against today is the following:
>
> > there is a way in M to describe objects (matrices) having an arbitrary
> > number of dimensions, defined just at runtime?
>
> > In detail, I work on an orthogonal lattice where my spins are defined,
> > but the simulations require sometimes to deal with 1d (arrays),
> > sometimes more.
>
> > Yet I'd like to write the most general code it is possible, e.g. when
> > writing a procedure that - given a location in the lattice at the
> > coordinates {i,j,...} - returns a list of locations of the nearest
> > neighbors
> > (in 1d: {{i-1},{i+1}}; in 2d: {{i-1,j},{i+1,j},{i,j-1},{i,j+1}} and so
> > on...)
>
> > thanks for any hint...
>
> >Alessandro Magni
>
> neighbors[v_List?VectorQ] := Flatten[{v-#,v+#}& /@
>                              IdentityMatrix@Length@v,1]
> neighbors[{x,y,z}]
>
> {{-1+x,y,z},
>  {1+x,y,z},
>  {x,-1+y,z},
>  {x,1+y,z},
>  {x,y,-1+z},
>  {x,y,1+z}}

```

• Prev by Date: Re: Gauss-Kronrod algorithm
• Next by Date: Re: Style Sheets in Version 6.0 - Again
• Previous by thread: Re: matrices with arbitrary dimensionality