【问题标题】:SAS Proc IML: Do Loop to Populate a MatrixSAS Proc IML:循环填充矩阵
【发布时间】:2013-03-21 02:43:14
【问题描述】:

我有以下代码在 MATLAB 中运行良好,我可以在 SAS/PROC IML 中转置:

[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 中我只是将其留空

【问题讨论】:

  • 你到底想做什么?看起来您正在尝试将 [6 rows, 4:col] 矩阵分配给 [6 rows, 1:col] 矩阵。这将如何运作 - A_temp 矩阵的其他 3 列会发生什么情况?
  • 我的 A_temp 是一个 30X30 矩阵,在循环之前为零。然后我从 COEFF 矩阵中选择 6 行和 26 列放入 A_temp 矩阵......如果它在 MATLAB 中工作......这在 IML 中会有多大不同?谢谢
  • 我的意思是,您将放置一个 6x27(4:30 是 27)矩阵并将其放置在 6x30 矩阵(A_temp 的定义子集)中。 SAS 应该在那里做什么?显然,Matlab 只是将它放在前 27 个中,但是 SAS 应该如何知道这是您想要的(而不是最后 27 个或其他)?

标签: sas sas-iml


【解决方案1】:

您应该正确指定它。 A[rows,] 表示 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多