2014-02-26 66 views
0

我正在尝试创建一个计算向量和矩阵的内部(点)积的宏。计算没有IML的内部产品

Y*X*t(Y) ## equivalent to the Sum(yi*Xij*yj) 

我没有IML,所以我尝试使用数组操作。

  1. 如何创建从数据多维数组,以避免在单个阵列中的索引 翻译。

  2. 如何调试我的循环,或者至少打印一些变量来控制我的程序?

  3. 如何删除临时变量?

我是一名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

编辑:以下内容涉及问题的描述,如何使用点,内部或标量乘积来评估二次型。实际的代码几乎没有问题。 年底编辑

如果你想减少它点的产品,那么你的价值是X_ij的线性化和应用Z_ij = Y_I * Y_j同样线性的点积。

另一种方法是根据矩阵的线性化将X_ij分成行或列,并计算Y的单独点积,比如说每行。得到的载体你的计算与Y.再次点积


编辑加入:在代码中的嵌套循环的长度NROWS应该从矢量y的长度与一个来确定,也许检查x的长度是否是nrows * nrows。

+0

谢谢。但我认为我的问题在这里不是数学。我知道如何按行/按列计算点积。我想用SAS来计算'x * A * t(x)'。 – agstudy

+0

当然,你不能只在x和y上调用点积。你的x有25个组件,y有5个。但是你可以将x拼接成5个5的部分,为它们中的每一个计算点积,形成一个新的向量u,然后计算u和y的点积。或者你生成z作为y的二元产物,然后在x和z上调用点积。 – LutzL

+0

我不明白。你能告诉我一些SAS代码吗? – agstudy