Matrix SAS-IML中的Do循环

Matrix SAS-IML中的Do循环,matrix,sas,sas-macro,do-loops,sas-iml,Matrix,Sas,Sas Macro,Do Loops,Sas Iml,我想在proc iml中使用宏do循环,如下所示: %Let Tab1=FirstTable; %Let Tab2=SecondTable; %Let Tab3=ThirdTable; *&Tab1-3 have been initialised as sas datasets; proc iml; * This works; use &Tab1; read all into Mat3; print Mat3; * This doesn't work; %Ma

我想在proc iml中使用宏do循环,如下所示:

%Let Tab1=FirstTable;
%Let Tab2=SecondTable;
%Let Tab3=ThirdTable;

*&Tab1-3 have been initialised as sas datasets;   

proc iml;

* This works;

use &Tab1;
read all into Mat3;
print Mat3;


* This doesn't work;

%Macro Define_mx;
    %do i=1 %to 2;
    use &Tab&i;
    read all into Mat&i ;
   %end;
  %Mend Define_mx;
%Define_mx;

*The two matrixes have not been initialised;

print Mat1;
print Mat2;
quit;
在现实中,我将不得不初始化像50个矩阵,所以一个do循环是必要的。 我不明白为什么循环不能将&Tab&I视为宏变量。
我还尝试了一个使用substr连接变量名的普通(非宏)do循环的变通方法,但也没有成功。我错过了什么

好,所以宏应该是:

%Macro Define_mx;
 %do i=1 %to 2;
   use &&Tab&i;
   read all into Mat&i ;
 %end;
 %Mend Define_mx;
%Define_mx;
Tab上的第二个符号是必需的,因为没有它宏处理器将尝试将&Tab解释为宏变量(它不存在)。因此,当尝试连接多个宏变量以创建新的宏变量时,使用&。

如果您有SAS/IML 12.1(随9.3m2发布),则有一种更简单的方法。 政府的做法如下:

ds = "MyData";
use (ds);
此外,如我在中所示,SAS/IML语言支持VALSET函数,该函数可以动态创建名为Mat1、Mat2等的矩阵。 可以组合这些功能以完全消除宏:

data a b c;                 /* create sample data sets */
x=1;y=2; output;
x=2;y=3; output;
run;

proc iml;
dsnames = {a b c};          /* names of data sets */
do i = 1 to ncol(dsnames);
   use (dsnames[i]);        /* open each data set */
   read all into X;
   close (dsname);
   MatName = "Mat"+strip(char(i)); /* create Mat1, Mat2,... */
   call valset(MatName, X);        /* assign values from data set */
end;
show names;

标签上的双安排行。。。我是个白痴,太棒了!请将您的解决方案作为答案提交并接受。这无疑是一个非常常见的错误,值得作为StackOverflow的解决方案:)在某个时候,摆脱宏也是我的目标。我想你可以写
调用valset(“Mat”+strip(char(I))以使其更整洁。不幸的是,我仍然在9.2上。据我所知,此解决方案不适用于此版本?