第八讲: SAS 交互式矩阵语言—IML 编程(PROC IML)
§8.1 引言
SAS/IML 是SAS 的一个过程,IML (Interactive Matrix Language )是交互式矩阵语言的简称。IML 中的基本处理单位是矩阵,所有运算和操作都是针对矩阵的。数值被看成1×1的矩阵。
SAS/IML 中的矩阵和DATA 步以及SAS 环境中的数据集可以双向流动:数据集可以读入到IML 中形成矩阵,IML 中的矩阵可以读出为SAS 数据集。
进入IML 环境的方法是执行语句PROC IML;
§8.2 IML 语言要素
I 、矩阵
1、矩阵的定义:矩阵是一个二维数阵,分为行和列。构成矩阵的数据称为元素,可以是数值也可以是字符。N ×1矩阵称为行向量,1×M 矩阵称为列向量,1×1矩阵称为标量(scalar)。矩阵的名字与SAS 文件的命名规则相同(以字母或下划线开头,以字母数字和下划线组成,长度不超过32个字符)。
2、矩阵的创建:矩阵可以通过元素列示定义,也可以赋值来创建。
(1)元素列示法:
proc iml ;
a=100;
b={1 2,3 4,5 6}; 注:元素重复的方法:创建矩阵时,如果需要连续重复输入一个数值作为矩阵的元素,则可采用元素重复因子(repeating Factor )实现。重复因子是重复次数加方括号,放在需要重复的元素之前。例如 proc iml ;
a=100;
b={[2]1 2,3 [2]4,[2]5 6};
print b;
结果为
1 1 2
3 4 4
5 5 6
(2)赋值法:赋值法通过赋值语句对已有的矩阵进行与运算(包括函数运算)创建矩阵。 一般形式:矩阵名=表达式;
proc iml ;
b={[2]1 2,3 [2]4,[2]5 6};
c=2#b;
print c;
结果为
2 2 4
6 8 8
10 10 12
3、矩阵表达式:表达式是由矩阵、函数以及运算符连接的式子,运算结果为矩阵。
(1)矩阵运算符:
按表达式中所在位置,运算符可以分为前缀运算符(prefix)、中缀运算符(infix)和后缀运算符(postfix)。
算符 类型 功能 举例
- 前缀矩阵取负号
+ 中缀矩阵相加特例:A+1,将A的各个元素加1
- 中缀矩阵相减特例:A-1,将A的各个元素减1
: 中缀创建指标向量 I=7:10
创建行向量i=(7 8 9 10)
* 中缀矩阵相乘
# 中缀矩阵逐元素相乘特例:A#3,将A的各个元素乘3
@ 中缀矩阵直积又称Kroneck积
** 中缀矩阵次方 A**2=A*A必须为方阵
## 中缀逐元素次方A##2将A的每个元素平方;A##B将A的每个元素按对应的B中元素取次方。
/ 中缀逐元素相除特例:A/2将A的各个元素除以2,而2/A则是将A 的各个元素除以2得出的矩阵
|| 中缀水平拼接将具有相同行数的两个矩阵水平拼接为一个矩阵// 中缀垂直拼接将具有相同列数的两个矩阵垂直拼接为一个矩阵<> 中缀逐元素比较并取大逐元素比较两个矩阵,新矩阵元素为其中大的>< 中缀逐元素比较并取小逐元素比较两个矩阵,新矩阵元素为其中小的
& 中缀逐元素全非0 逐元素检查两个矩阵,如果对应元素全非0,新矩阵元素为1,否则为0。特例:A&1,A&0
| 中缀逐元素有非0 逐元素检查两个矩阵,如果对应元素至少一个非0,新矩阵元素为1,否则为0。特例:A&1,A&0
^ 前缀逐元素检查是否0 逐元素检一个矩阵,如果对应元素为0,新矩阵元素为1,否则为0。
< 中缀逐元素比较大小逐元素比较两个矩阵,比较关系式成立,则新矩阵元素为1,否则为0。特例:A>2
> 中缀逐元素比较大小逐元素比较两个矩阵,比较关系式成立,则新矩阵元素为1,否则为0。特例:A<2
= 中缀逐元素比较相等逐元素比较两个矩阵,比较关系式成立,则新矩阵元素为1,否则为0。特例:A=2
<= 中缀逐元素比较大小逐元素比较两个矩阵,比较关系式成立,则新矩阵元素为1,否则为0。特例:A<=2
>= 中缀逐元素比较大小逐元素比较两个矩阵,比较关系式成立,则新矩阵元素为1,否则为0。特例:A>=2
^= 中缀逐元素比较不相等逐元素比较两个矩阵,比较关系式成立,则新矩阵元素为1,否则为0。特例:A^=0
` 后缀取转置(tanspose) A`
[ ] 后缀下标算符见后面内容
(2)矩阵下标(Subscripts)和下标缩减算符(subscript Reduction Operators):矩阵下标运算主要是有选择地对矩阵的一部分(元素、行列、子矩阵)进行的运算,包括从矩阵取子矩阵。
矩阵下标:下标运算符是一种特殊的后缀运算符,运算符用方括号括起来放在矩阵的后面。一般形式为
矩阵[行, 列]
功能:挑选矩阵特定的行和列形成新矩阵。
·选择矩阵的一个元素:c21=C[2,1]
c6=C[6]: 选择以行为顺序的第6个元素。
·选择矩阵的一行或一列:r3=C[3,]选择矩阵第3行,得出行向量r3
c2=C[ ,2]选择矩阵的第2列,得出列向量c2 ·选择子矩阵:S1=C[{1 3},{2 3 5}]选择矩阵第1、3行和2、3、5列得出矩阵S1。 S2=C[1:3,2:5]选择矩阵第1至3行和2至5列得出矩阵S2。
注意:用来标示行列的可以是变量或者表达式。
调用子程序的例子·根据下标位置对矩阵元素进行赋值:
C[2,1]=6将第2行第1列为止的元素改为6;
C[,1]={1,1,1,1}将第1列元素全部改为1。C[,1]={[4]1}`
例子:
proc iml;
t={32 -1,6 -43,222};
i=loc(t<0);
print i;
t[i]=0;
print t;
比较
proc iml;
t={32 -1,6 -43,222};
t[loc(t<0)]=0;
print t;
下标缩减(reduction)算符:缩减算符用来缩减矩阵的维数,将缩减算符放在下标的位置,可以对矩阵
进行跨行和跨列运算:位于行(列)位置的缩减算符表示跨行(列)运算,运算结果为只有一行(列)的矩阵。例如X[+,],缩减算符+位于下标中行的位置,表明缩减运算(求和)是跨行进行的(行的缩减),即将矩阵的每列元素相加,得出只有一行的矩阵(行向量)。如果矩阵下标没有行列之分,则位于其中的缩减算法是对矩阵的所有元素进行,得出的结果是一个数(1×1矩阵)。
缩减算符:
算符功能
+ 相加
# 相乘
## 平方和
<> 最大
>< 最小
<:> 最大值位置
>:< 最小值位置
: 均值
⎥⎥⎥⎦
⎤⎢⎢⎢⎣⎡=867345210A proc iml ;
A={0 1 2,5 4 3,7 6 8};
B=A[{2 3},+]; C=A[+,<>]; D=A[<>,+]; E=A[,><][+,]; F=A[,<:>]; G=A[>:<,]; H=A[:];
print b c d e f g h;
run ;
运行结果为:
B C D E F G H
12 13 21 9 3 1 1 1 4
21 1
3 功能解释:
A[{2 3},+]行下标选取第2、3行,列下标对选定的行进行跨列相加,缩减结果为2行1列的列向量
⎥⎦
⎤⎢⎣⎡2112 A[<>,+]行下标表示跨行取最大值(每列的最大值),列下标表示跨列求和。运算结果为每列最大值求和A[<>,+]=[21]。A[+,<>]则为每列求和后取最大值A[+,<>]=[13]。A[,<:>]为每行最大元素的位置(所处的列),得出列向量
A[,<:>]=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡313 而A[>:<,]为每列最小元素的位置(所处的行),得出行向量A[>:<,]=[1 1 1],A[:]的下标算符内没有行列标志,表明求平均值缩减运算(:)针对所有元素进行,因此得出A[:]=4。 注:①下标缩减算符可以重复使用;
②缩减算符可以单独放在下标算符内,表示对矩阵的所有元素实施操作。
思考??:
L=A[##];
K=A[{2 3},#];
M=A[{2 3},##];
H=A[<:>];
K=A[#];
M=A[>:<];
N=A[<>];
O=A[><];
的结果是什么?
II、函数:
(i)DATA步函数。SAS/IML中可以使用DATA步中的大部分函数。但也有一些不能使用。不能使用的函数有:
DIF n HBOUND LAG n PUT
DIM INPUT LBOUND
。而功能和DATA中有所区别的函数包括
MAX RANK SOUND SUBSTR
MIN REPEAT SSQ SUM
。具体内容可以参考SAS在线帮助。
(ii)除了DATA步可以使用的函数之外,SAS/IML本身有很多针对矩阵运算的函数,分为如下6类:
·矩阵查询函数:返回矩阵的有关信息。如any函数,当矩阵具有非0元素时函数值为1。 ·标量函数(scalar):对自变量矩阵实施逐元素运算。如abs函数就是对矩阵每个元素取绝对值。
·汇总函数:求自变量矩阵的所有元素的统计量。如SSQ函数取自变量矩阵所有元素的平方和。
·算术运算函数:对自变量矩阵实施矩阵代数运算。如TRACE函数,功能是计算自变量矩阵(方阵)的迹(trace)。
·矩阵重塑(reshaping)函数:对自变量矩阵进行重塑,得出另一个矩阵。如DIAG函数,功能是取自变
量矩阵(方阵)的对角线元素形成一个对角矩阵。
·线性代数和统计函数:对自变量矩阵进行线性代数运算。如INV函数计算自变量矩阵(方阵)的逆矩阵,GINV计算自变量矩阵的广义逆矩阵等。
SAS/IML的函数十分丰富,数量庞大,很难记忆。在SAS9.0及其以后的版本中,可以通过Help—>Using This Window —>目录—>Products—>IML—>Language Reference—
>Statements, Functions , and Subroutines 进行查阅,每个条目下都有详细的语法解释和应用例子。
III、语句
IML中的语句可以分为三类:控制语句、函数、Call语句和命令语句。
·控制语句列表:
Statements Action
DO, END定义DO组;
循环DO, END定义循环
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论