如何在SAS中使用IML在两个矩阵之间进行乘法运算

时间:2014-10-10 16:58:38

标签: sas sas-iml

我的数据集名为input_data,从EXCEL导入。

0.353481635 0.704898683 0.078640917 0.813815803 0.510842666 0.240912872 0.986312218 0.781868961 0.682272971
0.443441526 0.653187181 0.753981865 0.34909803  0.84215961  0.793863082 0.047816942 0.176759112 0.54213244
0.21443281  0.142501578 0.927011587 0.407251043 0.290280445 0.90730524  0.677030212 0.770541244 0.915728969
0.583493041 0.685127614 0.119042255 0.067769934 0.795793907 0.405029459 0.817724346 0.594170688 0.345660875
0.816193304 0.636823417 0.036348358 0.027985453 0.117027493 0.436516667 0.593191955 0.916981676 0.574223091
0.766842249 0.743249552 0.400052263 0.809650253 0.683610082 0.42152573  0.050520292 0.329441952 0.868549022
0.112847881 0.462579082 0.526220066 0.320851313 0.944585551 0.233027402 0.66141107  0.8380858   0.120044416
0.873949265 0.118525986 0.590234323 0.481974796 0.668976582 0.466558592 0.934633956 0.643438048 0.053508922

我还有另一个名为p的数据集

data p;
input p;
datalines;
0.12    
0.23    
0.11    
0.49    
0.52    
0.78    
0.8 
0.03    
0.02
run;

proc transpose data = p out=p2;
run;

我想要做的是使用SAS在IML中进行矩阵操作。

我已经有了一些代码,但最终的计算错误了。有人可以帮我一把吗?

proc iml;
use input_data;
read all var _num_ into x; 
print x;

proc iml;
use p2;
read all var _num_ into k;
print k;

proc iml;
Value1 = k * x;  
print Value1;
quit;

1 个答案:

答案 0 :(得分:3)

这里有几个问题。

首先,您有三个PROC IML语句。 PROC IML仅在运行时保持值;一旦它退出,所有的向量将永远消失。所以删除PROC IML。

其次,您需要确保您的矩阵正确排序和结构化。矩阵乘法的工作原理如下:

  

m x n * n x p = m x p

其中N和N必须相同。这是行x列,因此左侧矩阵必须具有与右侧矩阵具有行相同的列数。 (这是因为左侧矩阵中每行的每个元素乘以右侧矩阵中列中的相应元素然后求和,所以如果数字不匹配则不是可能的。)

所以你有8x9和9x1,你转换为1x9。所以首先,不要转换p,保持9x1。然后,确保你有正确的顺序(矩阵乘法不是可交换的,顺序很重要)。 k * x表示9x1 * 8x9不起作用(因为1和8不相同 - 请记住,内部两个数字必须匹配。)x*k确实有效,因为那是8x9 * 9x1,所以两个9匹配。

最终输出:

proc iml;
  use input_data;
  read all var _num_ into x; 
  print x;

  use p;
  read all var _num_ into k;
  print k;


  Value1 = x * k;  
  print Value1;
quit;