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.
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;
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;
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.
Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.
Find more tutorials on the SAS Users YouTube channel.