Solved
Contributor
Posts: 47

# Using Loop Index in Name

Hi,

Suppose I have the following code:

``````proc iml;
class_1 ={1 0 2,
2 3 2};
class_2 ={4 2 3,
2 6 2};
div ={1	2 4,
6	8 10};
new_1 = class_1 / div;
new_2 = class_2 / div;
print new_1;
print new_2;``````

I want to set up a loop to reduce the code. So something like

``````	do i = 1 to 2;
new_i = class_i / div;
print new_i;
end;

``````

What's the proper way to extract the value of i and use it as an actual value?

Thank you.

Accepted Solutions
Highlighted
Solution
‎03-09-2018 12:15 AM
SAS Super FREQ
Posts: 4,243

## Re: Using Loop Index in Name

For your example in which all variables are the same size, I recommend "flattening" the data into row vectors and storing the matrices as rows in a matrix.  For your example, it would look like this:

``````nr = 2;  /* number of rows */
nc = 3;  /* number of cols */
nMatrices = 2;  /* total number of matrices being stored */

class = {
1 0 2  2 3 2,  /* first 2x3 matrix */
4 2 3  2 6 2}; /* second 2x3 matrix */

div ={1 2 4  6	8 10};
new = class / div;

/* if you need to print or use as matrices, use SHAPE: */
do i = 1 to nMatrices;
newM = shape(new, nr, nc);
print newM;
end;``````

Although I don't recommend it, if you insist on using symbols that have numerical suffixes, you can use the VALUE and VALSET functions.

``````do i = 1 to 2;
cName = "class_" + strip(char(i));
c = value(cName);    /* get value of class_i */
new = c / div;
print new;
/* if necessary, use VALSET to create new_i */
end;
``````

All Replies
Highlighted
Solution
‎03-09-2018 12:15 AM
SAS Super FREQ
Posts: 4,243

## Re: Using Loop Index in Name

For your example in which all variables are the same size, I recommend "flattening" the data into row vectors and storing the matrices as rows in a matrix.  For your example, it would look like this:

``````nr = 2;  /* number of rows */
nc = 3;  /* number of cols */
nMatrices = 2;  /* total number of matrices being stored */

class = {
1 0 2  2 3 2,  /* first 2x3 matrix */
4 2 3  2 6 2}; /* second 2x3 matrix */

div ={1 2 4  6	8 10};
new = class / div;

/* if you need to print or use as matrices, use SHAPE: */
do i = 1 to nMatrices;
newM = shape(new, nr, nc);
print newM;
end;``````

Although I don't recommend it, if you insist on using symbols that have numerical suffixes, you can use the VALUE and VALSET functions.

``````do i = 1 to 2;
cName = "class_" + strip(char(i));
c = value(cName);    /* get value of class_i */
new = c / div;
print new;
/* if necessary, use VALSET to create new_i */
end;
``````
☑ This topic is solved.