2014-02-26 106 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