# RE: st: macros & expanding names in mata?

 From "David M. Drukker, StataCorp" To statalist@hsphsun2.harvard.edu Subject RE: st: macros & expanding names in mata? Date Mon, 06 Mar 2006 11:14:37 -0600

```Matissa Hollister <m73hollis@yahoo.com> asked about how to store and access
multiple matrices in mata.

Matissa described a macro type solution the problem, while indicating that
this solutions was not feasible because Mata is not a macro language.

Below, I propose a simple solution to Matissa's problem that stores and
accesses the submatrices in one big matrix.

Matissa has two vectors of parameters, say -x- and -y-.  For each
combination of the parameters, Matissa wants to create and store a matrix.

Let's suppose that x is 1 x p, y is 1 x q and that for each (x,y) a function
called dist(x,y) creates an n x m matrix.  The essence of the solution below
is simply to stack the p*q n x m matrices into a big matrix called D.  The
details of storing and retrieving the matrices are in the example code

clear

mata:

x = ( 1, 2, 3)
y = ( 4, 5)

// this is just an example function
real matrix dist( real scalar x, real scalar y, real scalar n, real scalar m)
{
return((1/abs(x-y))*J(n, m, 1))
}

p = cols(x)
q = cols(y)

n = 3
m = 4

// make D to hold individual matrices
// note that the row dimension is p*q*n because we stack the individual
// matrices

D = J(p*q*n, m, .)

// This loop puts the individual matrices into D
for(i=1; i<=p; ++i) {
for(j=1; j<=q; ++j) {
frow = ((i-1)*q +j-1)*n + 1	// first row for this matrix
lrow = ((i-1)*q +j)*n 	// last  row for this matrix
printf("when i = %1.0f and j = %1.0f, the matrix is\n", i, j)
dist(x[i], y[j], n, m)
D[|frow,1 \ lrow,m|] = dist(x[i], y[j], n, m)
}
}

printf("\n\nD now contains the individual matrices\n")
D

printf("\n\nNow let's retrieve them elements of D and print them out\n")
for(i=1; i<=p; ++i) {
for(j=1; j<=q; ++j) {
frow = ((i-1)*q +j-1)*n + 1	// first row for this matrix
lrow = ((i-1)*q +j)*n 	// last  row for this matrix
printf("when i = %1.0f and j = %1.0f, the matrix is\n", i, j)
D[|frow,1 \ lrow,m|]
}
}
end

--David
ddrukker@stata.com
*
*   For searches and help try:
*   http://www.stata.com/support/faqs/res/findit.html
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/
```