如何在SAS中使用IML实现两个矩阵的乘法

如何在SAS中使用IML实现两个矩阵的乘法,sas,sas-iml,Sas,Sas Iml,我在下面的“从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.2

我在下面的“从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;

你这里有几个问题

首先,您有三个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;

你这里有几个问题

首先,您有三个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;

你这里有几个问题

首先,您有三个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;

你这里有几个问题

首先,您有三个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;

看起来你有一个8x9矩阵和一个1x9矩阵,所以你不能将它们相乘。您需要将其中一个转换为8x9*9x1。这是假设你想要矩阵的点积。跳过转置步骤应该没问题。即使我移除转置,它也会显示x 0行0列(类型?,大小0)kpd 0行0列(类型?,大小0)将来也会使用标记,不仅因为这是关于iml,但是Rick回答这些问题的速度有时比我快,而且对于更难的IML问题肯定更了解。看起来你有一个8x9矩阵和一个1x9矩阵,所以你不能将它们相乘。你需要换位