在没有IML的情况下计算内部产品

时间:2014-02-26 13:40:23

标签: arrays matrix sas

我正在尝试创建一个计算向量和矩阵的内(点)乘积的宏。

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

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

  1. 如何从数据创建多维数组以避免索引 单数组内的翻译。

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

  3. 如何删除临时变量?
  4. 我是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;
    

    提前感谢您的帮助或任何调试数据的想法。

1 个答案:

答案 0 :(得分:0)

编辑:以下内容涉及问题的描述,如何使用点,内或标量积评估二次形式。实际代码几乎没问题。 结束编辑

如果要将其缩小为点积,那么您的值是X_ij的线性化和应用于Z_ij = Y_i * Y_j的相同线性化的点积。

另一种方法是根据矩阵的线性化将X_ij分成行或列,并计算Y的单独点积,例如每行。在得到的矢量中,您再次使用Y计算点积。


编辑添加:代码中嵌套循环的长度nrows应该从向量y的长度确定,也许检查x的长度是nrows * nrows。