List SAS IML对象列表

List SAS IML对象列表,list,object,abstract-data-type,sas-iml,List,Object,Abstract Data Type,Sas Iml,在SAS IML中,我希望将数字和字符类型以及不同维度的可变数量的Matice传递给用户定义的模块。这可以通过创建对象列表并将列表传递给模块来实现。例如,在R中,这种数据类型被称为“列表”。类似的功能在Matlab中作为单元格列表实现,并且在C++和java中通过继承抽象类实现。不幸的是,在SAS IML文档中找不到这一点 如何在SAS IML中创建任意对象列表 非常感谢 亚历克斯 瑞克,谢谢你的快速回复 带有可选参数的想法在长期内受到限制,因为我需要传递2个或更多参数,而不是15个或更少 然

在SAS IML中,我希望将数字和字符类型以及不同维度的可变数量的Matice传递给用户定义的模块。这可以通过创建对象列表并将列表传递给模块来实现。例如,在R中,这种数据类型被称为“列表”。类似的功能在Matlab中作为单元格列表实现,并且在C++和java中通过继承抽象类实现。不幸的是,在SAS IML文档中找不到这一点

如何在SAS IML中创建任意对象列表

非常感谢

亚历克斯


瑞克,谢谢你的快速回复

带有可选参数的想法在长期内受到限制,因为我需要传递2个或更多参数,而不是15个或更少

然而,第二个想法激励我采取另一种解决办法

在调用函数之前,我有一个矩阵名列表

names = {A, B, C};
在一个循环中,我将根据名称创建临时数据集,然后将名称传递给函数。在函数中,我将使所有的数据集都可以访问。调用函数后,我将在循环中删除它们

希望这不会在计算上很昂贵,否则将不得不求助于你的一个想法


谢谢,SAS/IML不支持矩阵列表

然而,这里有两个想法可以帮助你完成任务。第一个是定义模块以接受可选参数。您可以使用任意数量的矩阵调用模块,模块可以检测(通过使用ISSKIPED函数)您发送了多少矩阵。如果我有15个或更少的矩阵,这就是我会选择的

以下是如何实现第一个想法:

proc iml;
/* Soln 1: Use optional args; detect which args are skipped */
start MyMod(x1 ,  x2=,  x3=,  x4=,  x5=, 
            x6=,  x7=,  x8=,  x9=,  x10=,
            x11=, x12=, x13=, x14=, x15=);
   /* compute number of args (stop at first empty arg) */
   ArgList = "x1":"x15";
   d = j(1, ncol(ArgList), 0); /* initialize to 0 */
   /* count args  */
   do i = 1 to ncol(ArgList);
      if ^IsSkipped(ArgList[i]) then do;
         var = value( ArgList[i] );
         d[i] = prod(dimension(var));
      end;
   end;
   d = remove(d, loc(d=0)); /* remove empty elements */
   print "The args are " (argList[1:ncol(d)]);
finish;
通过传入三个不同大小的参数来测试模块:

A = {1 2, 3 4};
B = {1 2 3, 4 5 6};
C = I(4);
run MyMod(A, B, C);
第二个想法是将数值矩阵打包成一个较大的单个矩阵,其中第i行包含第i行矩阵的值。这将支持任意多个矩阵,但在内存方面有点浪费。首先,您需要计算矩阵并集中元素的最大数量。然后分配一个足够大的矩阵来容纳所有矩阵。VALUE函数(参见本文)将有助于自动化此步骤:

/* Soln 2: If more then 15 args, pack values as row vectors into large 
   numerical matrix. Use missing values to pad small matrices */
names = {A, B, C};
dims = j(nrow(names), 2);
do i = 1 to nrow(names);
   dims[i,] = dimension(value(names[i]));
end;
maxDim = max(dims[,#]);

/* convert each matrix to row vector; pad with missing values */
pack = j(nrow(names), maxDim, .);
do i = 1 to nrow(names);
   v = rowvec(value(names[i]));
   pack[i, 1:ncol(v)] = v;
end;
print pack;
包矩阵包含所有数值数据。(对字符矩阵执行类似操作。)然后可以将DIM和PACK矩阵发送到模块。模块可以使用形状函数将矩阵解压为其原始形状。例如,以下模块解压原始矩阵并打印它们:

start unpack(dim, pack);
   do i = 1 to nrow(dim);
      x = shape( pack[i,1:prod(dim[i,])], dim[i,1] );
      print i x;
   end;
finish;

run unpack(dims, pack);