总结R语言中矩阵运算的函数Word文件下载.docx
《总结R语言中矩阵运算的函数Word文件下载.docx》由会员分享,可在线阅读,更多相关《总结R语言中矩阵运算的函数Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
![总结R语言中矩阵运算的函数Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/30/aaed66a7-ce23-47d1-b1d9-9d1098d5d0ad/aaed66a7-ce23-47d1-b1d9-9d1098d5d0ad1.gif)
c1"
"
c2"
c3"
c4"
)
colname
12,nrow=3,ncol=4,dimnames=list(rowname,colname))
c1c2c3c4
r114710
r225811
3矩阵转置
A为m×
n矩阵,求A'
在R中可用函数t(),例如:
A=matrix(1:
A
t(A)
[4,]101112
若将函数t()作用于一个向量x,则R默认x为列向量,返回结果为一个行向量,例如:
[1]12345678910
t(x)
[,1][,2][,3][,4][,5][,6][,7][,8][,9][,10]
[1,]12345678910
class(x)
integer"
class(t(x))
matrix"
若想得到一个列向量,可用t(t(x)),例如:
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))
4矩阵相加减
在R中对同行同列矩阵相加减,可用符号:
“+”、“-”,例如:
A=B=matrix(1:
A+B
[1,]281420
[2,]4101622
[3,]6121824
A-B
[1,]0000
[2,]0000
[3,]0000
5数与矩阵相乘
n矩阵,c>
0,在R中求cA可用符号:
“*”,例如:
c=2
c*A
6矩阵相乘
n矩阵,B为n×
k矩阵,在R中求AB可用符号:
“%*%”,例如:
B=matrix(1:
A%*%B
[1,]70158246
[2,]80184288
[3,]90210330
若A为n×
m矩阵,要得到A'
B,可用函数crossprod(),该函数计算结果与t(A)%*%B相同,但是效率更高。
t(A)%*%B
[1,]3070110
[2,]70174278
[3,]110278446
crossprod(A,B)
矩阵Hadamard积:
若A={aij}m×
n,B={bij}m×
n,则矩阵的Hadamard积定义为:
A⊙B={aijbij}m×
n,R中Hadamard积可以直接运用运算符“*”例如:
16,4,4)
[1,]15913
[2,]261014
[3,]371115
[4,]481216
B=A
A*B
[1,]12581169
[2,]436100196
[3,]949121225
[4,]1664144256
R中这两个运算符的区别区加以注意。
7矩阵对角元素相关运算
例如要取一个方阵的对角元素,
16,nrow=4,ncol=4)
diag(A)
[1]161116
对一个向量应用diag()函数将产生以这个向量为对角元素的对角矩阵,例如:
diag(diag(A))
[1,]1000
[2,]0600
[3,]00110
[4,]00016
对一个正整数z应用diag()函数将产生以z维单位矩阵,例如:
diag(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,]
solve(a)
[1,]0.
[2,]-0.
[3,]-1.
solve(a)%*%a
[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
[1,]2111
[2,]1211
[3,]1121
[4,]1112
=eigen(A,symmetric=T)
$values
[1]5111
$vectors
$vectors%*%diag$values)%*%t$vectors)
t$vectors)%*%$vectors
10矩阵的Choleskey分解
对于正定矩阵A,可对其进行Choleskey分解,即:
A=P'
P,其中P为上三角矩阵,在R中可以用函数chol()进行Choleskey分解,例如:
chol(A)
t(chol(A))%*%chol(A)
crossprod(chol(A),chol(A))
若矩阵为对称正定矩阵,可以利用Choleskey分解求行列式的值,如:
prod(diag(chol(A))^2)
[1]5
det(A)
若矩阵为对称正定矩阵,可以利用Choleskey分解求矩阵的逆,这时用函数chol2inv(),这种用法更有效。
如:
chol2inv(chol(A))
solve(A)
11矩阵奇异值分解
n矩阵,rank(A)=r,可以分解为:
A=UDV'
其中U'
U=V'
V=I。
在R中可以用函数scd()进行奇异值分解,例如:
18,3,6)
[,1][,2][,3][,4][,5][,6]
[1,]147101316
[2,]258111417
[3,]369121518
svd(A)
$d
[1]+01+00
$u
[3,]-0.
$v
[1,]-0.
[2,]-0.0.
[3,]-0.-0.
[4,]-0.
[5,]-0.0.
[6,]-0.-0.
=svd(A)
$u%*%diag$d)%*%t$v)
t$u)%*%$u
[3,]+00
t$v)%*%$v
12矩阵QR分解
n矩阵可以进行QR分解,A=QR,其中:
Q'
Q=I,在R中可以用函数qr()进行QR分解,例如:
qr(A)
$qr
[1,]+01+01
[2,]+00+00
$rank
[1]2
$qraux
[1]+00+00+00
$pivot
[1]1234
attr(,"
class"
qr"
rank项返回矩阵的秩,qr项包含了矩阵Q和R的信息,要得到矩阵Q和R,可以用函数()和()作用qr()的返回结果,例如:
(qr(A))
[4,]+00
[2,]0.
[3,]-0.
(qr(A))%*%(qr(A))
t(qr(A)))%*%(qr(A))
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”)
ginv(A)
验证性质1:
A%*%ginv(A)%*%A
验证性质2:
ginv(A)%*%A%*%ginv(A)
验证性质3:
t(A%*%ginv(A))
A%*%ginv(A)
验证性质4:
t(ginv(A)%*%A)
ginv(A)%*%A
14矩阵Kronecker积
m矩阵A与h×
k矩阵B的kronecker积为一个nh×
mk维矩阵,
在R中kronecker积可以用函数kronecker()来计算,例如:
4,2,2)
B=matrix(rep(1,4),2,2)
[,1][,2]
[1,]13
[2,]24
B
[1,]11
[2,]11
kronecker(A,B)
[1,]1133
[2,]1133
[3,]2244
[4,]2244
15矩阵的维数
在R中很容易得到一个矩阵的维数,函数dim()将返回一个矩阵的维数,nrow()返回行数,ncol()返回列数,例如:
12,3,4)
nrow(A)
[1]3
ncol(A)
[1]4
16矩阵的行和、列和、行平均与列平均
在R中很容易求得一个矩阵的各行的和、平均数与列的和、平均数,例如:
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)
apply(A,1,mean)
apply(A,2,sum)
apply(A,2,mean)
apply()函数功能强大,我们可以对矩阵的行或者列进行其它运算,例如:
计算每一列的方差
A=matrix(rnorm(100),20,5)
apply(A,2,var)
apply(A,2,function(x,a)x*a,a=2)
注意:
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("
"
chol"
solve"
))
method指定求逆方法,选用“qr”效率最高,选用“chol”精度最高,选用“slove”与slove(crossprod(x,x))效果相同,例如:
A=matrix(rnorm(16),4,4)
solveCrossprod(A,method="
solve(crossprod(A,A))
18取矩阵的上、下三角部分
在R中,我们可以很方便的取到一个矩阵的上、下三角部分的元素,函数()和函数()提供了有效的方法。
args
function(x,diag=FALSE)
函数将返回一个逻辑值矩阵,其中下三角部分为真,上三角部分为假,选项diag为真时包含对角元素,为假时不包含对角元素。
()的效果与之孑然相反。
(A)
[1,]FALSEFALSEFALSEFALSE
[2,]TRUEFALSEFALSEFALSE
[3,]TRUETRUEFALSEFALSE
[4,]TRUETRUETRUEFALSE
(A,diag=T)
[1,]TRUEFALSEFALSEFALSE
[2,]TRUETRUEFALSEFALSE
[3,]TRUETRUETRUEFALSE
[4,]TRUETRUETRUETRUE
[1,]FALSETRUETRUETRUE
[2,]FALSEFALSETRUETRUE
[3,]FALSEFALSEFALSETRUE
[4,]FALSEFALSEFALSEFALSE
[1,]TRUETRUETRUETRUE
[2,]FALSETRUETRUETRUE
[3,]FALSEFALSETRUETRUE
[4,]FALSEFALSEFALSETRUE
A[(A)]=0
[2,]061014
[3,]001115
[2,]2600
[3,]37110
19backsolve&
fowardsolve函数
这两个函数用于解特殊线性方程组,其特殊之处在于系数矩阵为上或下三角。
args(backsolve)
function(r,x,k=ncol