SAS PROC IML:DO循环来填充矩阵
问题描述:
我有下面的代码,在MATLAB的伟大工程,我要在SAS/PROC IML转:SAS PROC IML:DO循环来填充矩阵
[row col] = size(coeff);
A_temp = zeros(row,col);
for i = 1: row/6
A_temp(6*(i-1)+1:6*i,:) = coeff(6*(i-1)+1:6*i,4:col);end;
在PROC IML我做了以下内容:
proc iml;
use i.coeff;
read all var {...} into coeff;
print coeff;
row=NROW(coeff);
print row;
col=NCOL(coeff);
print col;
A_temp=J(row,col,0); *create zero matrix;
print A_temp;
Do i=1 TO row/6;
A_temp[(6*(i-1)+1):(6*i),]=coeff[(6*(i-1)+1):(6*i),(4:col)];
END;
quit;
代码在DO循环中发生故障“(执行)矩阵不符合操作 ”...为什么?如果我在PROC IML中正确理解,如果我希望选择所有列(在MATLAB中,这将是“:”),但是在SAS IML中,我只需将它留为空白
答
您应该正确指定它。 A [行,]意味着A的所有列,而不仅仅是它们中的任何数量。看到这个简化的例子:
proc iml;
/* use i.coeff;
read all var {...} into coeff;
print coeff;
*/
coeff = J(15,10,3);
row=NROW(coeff);
print row;
col=NCOL(coeff);
print col;
A_temp=J(row,col,0); *create zero matrix;
print A_temp;
Do i=1 TO row;
* does not work; *A_temp[i,]=coeff[i,(4:col)];
A_temp[i,1:col-3]=coeff[i,(4:col)];
END;
quit;
+0
我明白了!非常感谢!! – Plug4 2013-03-21 06:22:13
到底你到底想干什么?看起来你正在试图为[6 rows,1:col]矩阵分配一个[6 rows,4:col]矩阵。那会如何工作 - A_temp矩阵的其他3列会发生什么? – Joe 2013-03-20 18:26:19
我的A_temp是一个30X30的矩阵,在循环之前有零。然后我从COEFF矩阵中选择6行和26列放入A_temp矩阵中......如果它在MATLAB中起作用,那么IML中的这些方法有何不同?谢谢 – Plug4 2013-03-20 18:37:44
我的意思是,你要放置一个6x27(4:30是27)矩阵并将其放置在6x30矩阵(A_temp的定义子集)中。 SAS应该在那里做什么?很显然,Matlab刚刚将它列入前27名,但SAS应该如何知道这是你想要的(而不是最后的27个或其他)? – Joe 2013-03-20 18:41:55