List SAS IML对象列表
在SAS IML中,我希望将数字和字符类型以及不同维度的可变数量的Matice传递给用户定义的模块。这可以通过创建对象列表并将列表传递给模块来实现。例如,在R中,这种数据类型被称为“列表”。类似的功能在Matlab中作为单元格列表实现,并且在C++和java中通过继承抽象类实现。不幸的是,在SAS IML文档中找不到这一点 如何在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个或更少 然
瑞克,谢谢你的快速回复 带有可选参数的想法在长期内受到限制,因为我需要传递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);