我正在尝试创建一个计算向量和矩阵的内(点)乘积的宏。
Y*X*t(Y) ## equivalent to the Sum(yi*Xij*yj)
我没有IML,所以我尝试使用数组操作。
如何从数据创建多维数组以避免索引 单数组内的翻译。
如何调试我的循环,或者至少打印一些变量来控制我的程序?
我是SAS新手,但这是我到目前为止所尝试的:
%macro dot_product(X = ,y=, value= );
/* read number of rows */
%let X_id=%sysfunc(open(&X));
%let nrows=%sysfunc(attrn(&X_id,nobs));
%let rc=%sysfunc(close(&X_id));
data &X.;
set &X.;
array arr_X{*} _numeric_;
set &y.;
array arr_y{*} _numeric_;
do i = 1 to &nrows;
do j = 1 to &nrows;
value + arr_y[i]*arr_X[j + &nrows*(i-1)]*arr_y[j];
end;
end;
run;
%mend;
当我运行时:
%dot_product(X=X,y=y,value=val);
我收到此错误:
ERROR: Array subscript out of range at line 314 column 158.
我用它来生成数据:
data X;
array myCols{*} col1-col5;
do i = 1 to 5;
do j = 1 to dim(myCols);
myCols{j}=ranuni(123);
end;
output;
end;
drop i j;
run;
/* create a vector y */
data y;
array myCols{*} col1-col5;
do j = 1 to dim(myCols);
myCols{j}=ranuni(123);
end;
output;
drop j;
run;
提前感谢您的帮助或任何调试数据的想法。
答案 0 :(得分:0)
编辑:以下内容涉及问题的描述,如何使用点,内或标量积评估二次形式。实际代码几乎没问题。 结束编辑
如果要将其缩小为点积,那么您的值是X_ij的线性化和应用于Z_ij = Y_i * Y_j的相同线性化的点积。
另一种方法是根据矩阵的线性化将X_ij分成行或列,并计算Y的单独点积,例如每行。在得到的矢量中,您再次使用Y计算点积。
编辑添加:代码中嵌套循环的长度nrows应该从向量y的长度确定,也许检查x的长度是nrows * nrows。