0
我正在尝试创建一个计算向量和矩阵的内部(点)积的宏。计算没有IML的内部产品
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;
在此先感谢您的帮助或任何想法调试我的数据。
谢谢。但我认为我的问题在这里不是数学。我知道如何按行/按列计算点积。我想用SAS来计算'x * A * t(x)'。 – agstudy
当然,你不能只在x和y上调用点积。你的x有25个组件,y有5个。但是你可以将x拼接成5个5的部分,为它们中的每一个计算点积,形成一个新的向量u,然后计算u和y的点积。或者你生成z作为y的二元产物,然后在x和z上调用点积。 – LutzL
我不明白。你能告诉我一些SAS代码吗? – agstudy