0

我在从 EXCEL 导入下面有名为 input_data 的数据集。

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;
4

1 回答 1

3

你在这里有几个问题。

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

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

mxn * nxp = mxp

其中两个 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;
于 2014-10-10T17:56:07.880 回答