【问题标题】:How to do multiplication between two matrix using IML in SAS如何在 SAS 中使用 IML 在两个矩阵之间进行乘法运算
【发布时间】:2014-10-10 16:58:37
【问题描述】:

我在从 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;

【问题讨论】:

  • 看起来你有一个 8x9 矩阵和一个 1x9 矩阵,所以你不能将它们相乘。您需要将其中一个转置为 8x9 * 9x1。这是假设您想要矩阵的点积。跳过转置步骤,应该没问题。
  • 即使我删除转置,它显示 x 0 row 0 col (type ?, size 0) kpd 0 row 0 col (type ?, size 0)
  • 将来也可以使用sas-iml 标签,不仅因为这是关于 iml 的,而且 Rick 有时会比我更快地回答这些问题,而且对于更难的 IML 问题肯定更有知识。

标签: sas sas-iml


【解决方案1】:

这里有几个问题。

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

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

m x n * n x p = m x p

其中两个 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多