总结R语言中矩阵运算的函数.docx
《总结R语言中矩阵运算的函数.docx》由会员分享,可在线阅读,更多相关《总结R语言中矩阵运算的函数.docx(26页珍藏版)》请在冰豆网上搜索。
总结R语言中矩阵运算的函数
总结R语言中矩阵运算的函数
1创建一个向量
在R中可以用函数c()来创建一个向量,例如:
>x=c(1,2,3,4)
>x
[1]1234
2创建一个矩阵
在R中可以用函数matrix()来创建一个矩阵,应用该函数时需要输入必要的参数值。
>args(matrix)
function(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)
data项为必要的矩阵元素,nrow为行数,ncol为列数,注意nrow与ncol的乘积应为矩阵元素个数,byrow项控制排列元素时是否按行进行,dimnames给定行和列的名称。
例如:
>matrix(1:
12,nrow=3,ncol=4)
[,1][,2][,3][,4]
[1,]14710
[2,]25811
[3,]36912
>matrix(1:
12,nrow=4,ncol=3)
[,1][,2][,3]
[1,]159
[2,]2610
[3,]3711
[4,]4812
>matrix(1:
12,nrow=4,ncol=3,byrow=T)
[,1][,2][,3]
[1,]123
[2,]456
[3,]789
[4,]101112
>rowname
[1]"r1""r2""r3"
>colname=c("c1","c2","c3","c4")
>colname
[1]"c1""c2""c3""c4"
>matrix(1:
12,nrow=3,ncol=4,dimnames=list(rowname,colname))
c1c2c3c4
r114710
r225811
3矩阵转置
A为m×n矩阵,求A'在R中可用函数t(),例如:
>A=matrix(1:
12,nrow=3,ncol=4)
>A
[,1][,2][,3][,4]
[1,]14710
[2,]25811
[3,]36912
>t(A)
[,1][,2][,3]
[1,]123
[2,]456
[3,]789
[4,]101112
若将函数t()作用于一个向量x,则R默认x为列向量,返回结果为一个行向量,例如:
>x
[1]12345678910
>t(x)
[,1][,2][,3][,4][,5][,6][,7][,8][,9][,10]
[1,]12345678910
>class(x)
[1]"integer"
>class(t(x))
[1]"matrix"
若想得到一个列向量,可用t(t(x)),例如:
>x
[1]12345678910
>t(t(x))
[,1]
[1,]1
[2,]2
[3,]3
[4,]4
[5,]5
[6,]6
[7,]7
[8,]8
[9,]9
[10,]10
>y=t(t(x))
>t(t(y))
[,1]
[1,]1
[2,]2
[3,]3
[4,]4
[5,]5
[6,]6
[7,]7
[8,]8
[9,]9
[10,]10
4矩阵相加减
在R中对同行同列矩阵相加减,可用符号:
“+”、“-”,例如:
>A=B=matrix(1:
12,nrow=3,ncol=4)
>A+B
[,1][,2][,3][,4]
[1,]281420
[2,]4101622
[3,]6121824
>A-B
[,1][,2][,3][,4]
[1,]0000
[2,]0000
[3,]0000
5数与矩阵相乘
A为m×n矩阵,c>0,在R中求cA可用符号:
“*”,例如:
>c=2
>c*A
[,1][,2][,3][,4]
[1,]281420
[2,]4101622
[3,]6121824
6矩阵相乘
A为m×n矩阵,B为n×k矩阵,在R中求AB可用符号:
“%*%”,例如:
>A=matrix(1:
12,nrow=3,ncol=4)
>B=matrix(1:
12,nrow=4,ncol=3)
>A%*%B
[,1][,2][,3]
[1,]70158246
[2,]80184288
[3,]90210330
若A为n×m矩阵,要得到A'B,可用函数crossprod(),该函数计算结果与t(A)%*%B相同,但是效率更高。
例如:
>A=matrix(1:
12,nrow=4,ncol=3)
>B=matrix(1:
12,nrow=4,ncol=3)
>t(A)%*%B
[,1][,2][,3]
[1,]3070110
[2,]70174278
[3,]110278446
>crossprod(A,B)
[,1][,2][,3]
[1,]3070110
[2,]70174278
[3,]110278446
矩阵Hadamard积:
若A={aij}m×n,B={bij}m×n,则矩阵的Hadamard积定义为:
A⊙B={aijbij}m×n,R中Hadamard积可以直接运用运算符“*”例如:
>A=matrix(1:
16,4,4)
>A
[,1][,2][,3][,4]
[1,]15913
[2,]261014
[3,]371115
[4,]481216
>B=A
>A*B
[,1][,2][,3][,4]
[1,]12581169
[2,]436100196
[3,]949121225
[4,]1664144256
R中这两个运算符的区别区加以注意。
7矩阵对角元素相关运算
例如要取一个方阵的对角元素,
>A=matrix(1:
16,nrow=4,ncol=4)
>A
[,1][,2][,3][,4]
[1,]15913
[2,]261014
[3,]371115
[4,]481216
>diag(A)
[1]161116
对一个向量应用diag()函数将产生以这个向量为对角元素的对角矩阵,例如:
>diag(diag(A))
[,1][,2][,3][,4]
[1,]1000
[2,]0600
[3,]00110
[4,]00016
对一个正整数z应用diag()函数将产生以z维单位矩阵,例如:
>diag(3)
[,1][,2][,3]
[1,]100
[2,]010
[3,]001
8矩阵求逆
矩阵求逆可用函数solve(),应用solve(a,b)运算结果是解线性方程组ax=b,若b缺省,则系统默认为单位矩阵,因此可用其进行矩阵求逆,例如:
>a=matrix(rnorm(16),4,4)
>a
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
>solve(a)
[,1][,2][,3][,4]
[1,]0.
[2,]-0.
[3,]-1.
[4,]
>solve(a)%*%a
[,1][,2][,3][,4]
[1,]+00
[2,]+00
[3,]+00
[4,]+00
9矩阵的特征值与特征向量
矩阵A的谱分解为A=UΛU',其中Λ是由A的特征值组成的对角矩阵,U的列为A的特征值对应的特征向量,在R中可以用函数eigen()函数得到U和Λ,
>args(eigen)
function(x,symmetric,=FALSE,EISPACK=FALSE)
其中:
x为矩阵,symmetric项指定矩阵x是否为对称矩阵,若不指定,系统将自动检测x是否为对称矩阵。
例如:
>A=diag(4)+1
>A
[,1][,2][,3][,4]
[1,]2111
[2,]1211
[3,]1121
[4,]1112
>=eigen(A,symmetric=T)
>
$values
[1]5111
$vectors
[,1][,2][,3][,4]
[1,]+00
[2,]
[3,]
[4,]
>$vectors%*%diag$values)%*%t$vectors)
[,1][,2][,3][,4]
[1,]2111
[2,]1211
[3,]1121
[4,]1112
>t$vectors)%*%$vectors
[,1][,2][,3][,4]
[1,]+00
[2,]+00
[3,]+00
[4,]+00
10矩阵的Choleskey分解
对于正定矩阵A,可对其进行Choleskey分解,即:
A=P'P,其中P为上三角矩阵,在R中可以用函数chol()进行Choleskey分解,例如:
>A
[,1][,2][,3][,4]
[1,]2111
[2,]1211
[3,]1121
[4,]1112
>chol(A)
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
>t(chol(A))%*%chol(A)
[,1][,2][,3][,4]
[1,]2111
[2,]1211
[3,]1121
[4,]1112
>crossprod(chol(A),chol(A))
[,1][,2][,3][,4]
[1,]2111
[2,]1211
[3,]1121
[4,]1112
若矩阵为对称正定矩阵,可以利用Choleskey分解求行列式的值,如:
>prod(diag(chol(A))^2)
[1]5
>det(A)
[1]5
若矩阵为对称正定矩阵,可以利用Choleskey分解求矩阵的逆,这时用函数chol2inv(),这种用法更有效。
如:
>chol2inv(chol(A))
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
>solve(A)
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
11矩阵奇异值分解
A为m×n矩阵,rank(A)=r,可以分解为:
A=UDV',其中U'U=V'V=I。
在R中可以用函数scd()进行奇异值分解,例如:
>A=matrix(1:
18,3,6)
>A
[,1][,2][,3][,4][,5][,6]
[1,]147101316
[2,]258111417
[3,]369121518
>svd(A)
$d
[1]+01+00
$u
[,1][,2][,3]
[1,]0.
[2,]
[3,]-0.
$v
[,1][,2][,3]
[1,]-0.
[2,]-0.0.
[3,]-0.-0.
[4,]-0.
[5,]-0.0.
[6,]-0.-0.
>=svd(A)
>$u%*%diag$d)%*%t$v)
[,1][,2][,3][,4][,5][,6]
[1,]147101316
[2,]258111417
[3,]369121518
>t$u)%*%$u
[,1][,2][,3]
[1,]+00
[2,]+00
[3,]+00
>t$v)%*%$v
[,1][,2][,3]
[1,]+00
[2,]+00
[3,]+00
12矩阵QR分解
A为m×n矩阵可以进行QR分解,A=QR,其中:
Q'Q=I,在R中可以用函数qr()进行QR分解,例如:
>A=matrix(1:
16,4,4)
>qr(A)
$qr
[,1][,2][,3][,4]
[1,]+01+01
[2,]+00+00
[3,]
[4,]
$rank
[1]2
$qraux
[1]+00+00+00
$pivot
[1]1234
attr(,"class")
[1]"qr"
rank项返回矩阵的秩,qr项包含了矩阵Q和R的信息,要得到矩阵Q和R,可以用函数()和()作用qr()的返回结果,例如:
>(qr(A))
[,1][,2][,3][,4]
[1,]+01+01
[2,]+00+00
[3,]
[4,]+00
>(qr(A))
[,1][,2][,3][,4]
[1,]-0.
[2,]0.
[3,]-0.
[4,]
>(qr(A))%*%(qr(A))
[,1][,2][,3][,4]
[1,]15913
[2,]261014
[3,]371115
[4,]481216
>t(qr(A)))%*%(qr(A))
[,1][,2][,3][,4]
[1,]+00
[2,]+00
[3,]+00
[4,]+00
>(qr(A))
[,1][,2][,3][,4]
[1,]15913
[2,]261014
[3,]371115
[4,]481216
13矩阵广义逆(Moore-Penrose)
n×m矩阵A+称为m×n矩阵A的Moore-Penrose逆,如果它满足下列条件:
①AA+A=A;②A+AA+=A+;③(AA+)H=AA+;④(A+A)H=A+A
在R的MASS包中的函数ginv()可计算矩阵A的Moore-Penrose逆,例如:
library(“MASS”)
>A
[,1][,2][,3][,4]
[1,]15913
[2,]261014
[3,]371115
[4,]481216
>ginv(A)
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
验证性质1:
>A%*%ginv(A)%*%A
[,1][,2][,3][,4]
[1,]15913
[2,]261014
[3,]371115
[4,]481216
验证性质2:
>ginv(A)%*%A%*%ginv(A)
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
验证性质3:
>t(A%*%ginv(A))
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
>A%*%ginv(A)
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
验证性质4:
>t(ginv(A)%*%A)
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
>ginv(A)%*%A
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
14矩阵Kronecker积
n×m矩阵A与h×k矩阵B的kronecker积为一个nh×mk维矩阵,
在R中kronecker积可以用函数kronecker()来计算,例如:
>A=matrix(1:
4,2,2)
>B=matrix(rep(1,4),2,2)
>A
[,1][,2]
[1,]13
[2,]24
>B
[,1][,2]
[1,]11
[2,]11
>kronecker(A,B)
[,1][,2][,3][,4]
[1,]1133
[2,]1133
[3,]2244
[4,]2244
15矩阵的维数
在R中很容易得到一个矩阵的维数,函数dim()将返回一个矩阵的维数,nrow()返回行数,ncol()返回列数,例如:
>A=matrix(1:
12,3,4)
>A
[,1][,2][,3][,4]
[1,]14710
[2,]25811
[3,]36912
>nrow(A)
[1]3
>ncol(A)
[1]4
16矩阵的行和、列和、行平均与列平均
在R中很容易求得一个矩阵的各行的和、平均数与列的和、平均数,例如:
>A
[,1][,2][,3][,4]
[1,]14710
[2,]25811
[3,]36912
>rowSums(A)
[1]222630
>rowMeans(A)
[1]
>colSums(A)
[1]6152433
>colMeans(A)
[1]25811
上述关于矩阵行和列的操作,还可以使用apply()函数实现。
>args(apply)
function(X,MARGIN,FUN,...)
其中:
x为矩阵,MARGIN用来指定是对行运算还是对列运算,MARGIN=1表示对行运算,MARGIN=2表示对列运算,FUN用来指定运算函数,...用来给定FUN中需要的其它的参数,例如:
>apply(A,1,sum)
[1]222630
>apply(A,1,mean)
[1]
>apply(A,2,sum)
[1]6152433
>apply(A,2,mean)
[1]25811
apply()函数功能强大,我们可以对矩阵的行或者列进行其它运算,例如:
计算每一列的方差
>A=matrix(rnorm(100),20,5)
>apply(A,2,var)
[1]
>apply(A,2,function(x,a)x*a,a=2)
[,1][,2][,3][,4]
[1,]281420
[2,]4101622
[3,]6121824
注意:
apply(A,2,function(x,a)x*a,a=2)与A*2效果相同,此处旨在说明如何应用alpply函数。
17矩阵X'X的逆
在统计计算中,我们常常需要计算这样矩阵的逆,如OLS估计中求系数矩阵。
R中的包“strucchange”提供了有效的计算方法。
>args(solveCrossprod)
function(X,method=c("qr","chol","solve"))
其中:
method指定求逆方法,选用“qr”效率最高,选用“chol”精度最高,选用“slove”与slove(crossprod(x,x))效果相同,例如:
>A=matrix(rnorm(16),4,4)
>solveCrossprod(A,method="qr")
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
>solveCrossprod(A,method="chol")
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
>solveCrossprod(A,method="solve")
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
>solve(crossprod(A,A))
[,1][,2][,3][,4]
[1,]
[2,]
[3,]
[4,]
18取矩阵的上、下三角部分
在R中,我们可以很方便的取到一个矩阵的上、下三角部分的元素,函数()和函数()提供了有效的方法。
>args
function(x,diag=FALSE)
函数将返回一个逻辑值矩阵,其中下三角部分为真,上三角部分为假,选项diag为真时包含对角元素,为假时不包含对角元素。
()的效果与之孑然相反。
例如:
>A
[,1][,2][,3][,4]
[1,]15913
[2,]261014
[3,]371115
[4,]481216
>(A)
[,1][,2][,3][,4]
[1,]FALSEFALSEFALSEFALSE
[2,]TRUEFALSEFALSEFALSE
[3,]TRUETRUEFALSEFALSE
[4,]TRUETRUETRUEFALSE
>(A,diag=T)
[,1][,2][,3][,4]
[1,]TRUEFALSEFALSEFALSE
[2,]TRUETRUEFALSEFALSE
[3,]TRUETRUETRUEFALSE
[4,]TRUETRUETRUETRUE
>(A)
[,1][,2][,3][,4]
[1,]FALSETRUETRUETRUE
[2,]FALSEFALSETRUETRUE
[3,]FALSEFALSEFALSETRUE
[4,]FALSEFALSEFALSEFALSE
>(A,diag=T)
[,1][,2][,3][,4]
[1,]TRUETRUETRUETRUE
[2,]FALSETRUETRUETRUE
[3,]FALSEFALSETRUETRUE
[4,]FALSEFALSEFALSETRUE
>A[(A)]=0
>A
[,1][,2][,3][,4]
[1,]15913
[2,]061014
[3,]001115
[4,]00016
>A[(A)]=0
>A
[,1][,2][,3][,4]
[1,]1000
[2,]2600
[3,]37110
[4,]481216
19backsolve&fowardsolve函数
这两个函数用于解特殊线性方程组,其特殊之处在于系数矩阵为上或下三角。
>args(backsolve)
function(r,x,k=ncol