The NDX2SUB function converts indices of a matrix into subscripts for the matrix. The arguments are as follows:
specifies the dimensions of the matrix. For example, the value of this argument might be the vector that is returned from the DIMENSION function.
specifies the elements of a matrix, enumerated in row-major order.
The indices of an matrix are the elements . The indices enumerate the elements in row-major order: the first indices enumerate the first row, the next indices enumerate the second row, and so forth. The NDX2SUB function converts indices to subscripts, which are pairs such that and .
You can use the module to display the rows and columns of elements that satisfy a certain condition. For example, the following statements locate all the even numbers in a matrix and then call the NDX2SUB function to find the subscripts of the even elements:
x = {1 2 3, 4 5 6, 7 8 9, 10 11 12}; idx = loc( mod(x, 2)=0 ); dim = nrow(x) || ncol(x); s = ndx2sub(dim, idx); print s;
You can also use the NDX2SUB function to keep track of indices and subscripts of multidimensional arrays. Although the SAS/IML language does not support multidimensional arrays, a common technique is to store the elements of a array in a two-dimensional matrix with rows and columns. For example, you can store the contents of four arrays in a single matrix, as shown in the following program:
/* Store four 3x3 matrices in a 12x3 matrix (each group of three rows is a matrix) */ dim = {4 3 3}; m = j(12, 3); p = 9; /* = prod(dim[2:ncol(dim)]) */ do i = 1 to 4; startNdx = 1 + (i-1)*p; endNdx = i*p; ndx = startNdx:endNdx; /* get indices for i_th matrix */ m[ndx] = i; /* assign or extract matrix */ subscripts = ndx2sub(dim, ndx); /* or get subscripts */ end; print m;
Figure 24.6: Storing Smaller Matrices inside a Larger Matrix
m | ||
---|---|---|
1 | 1 | 1 |
1 | 1 | 1 |
1 | 1 | 1 |
2 | 2 | 2 |
2 | 2 | 2 |
2 | 2 | 2 |
3 | 3 | 3 |
3 | 3 | 3 |
3 | 3 | 3 |
4 | 4 | 4 |
4 | 4 | 4 |
4 | 4 | 4 |