总结R语言中矩阵运算的函数.docx

上传人:b****6 文档编号:8563534 上传时间:2023-01-31 格式:DOCX 页数:26 大小:19.68KB
下载 相关 举报
总结R语言中矩阵运算的函数.docx_第1页
第1页 / 共26页
总结R语言中矩阵运算的函数.docx_第2页
第2页 / 共26页
总结R语言中矩阵运算的函数.docx_第3页
第3页 / 共26页
总结R语言中矩阵运算的函数.docx_第4页
第4页 / 共26页
总结R语言中矩阵运算的函数.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

总结R语言中矩阵运算的函数.docx

《总结R语言中矩阵运算的函数.docx》由会员分享,可在线阅读,更多相关《总结R语言中矩阵运算的函数.docx(26页珍藏版)》请在冰豆网上搜索。

总结R语言中矩阵运算的函数.docx

总结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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1