R-矩陣的運(yùn)算

這是我見過最全的R矩陣運(yùn)算的例子。
原文:
https://blog.csdn.net/kkkkkiko/article/details/83118783
PS:這位作者轉(zhuǎn)的其他人的,但是原文已經(jīng)不見了。以防這個(gè)也消失了。。。。本人再轉(zhuǎn)一次,以防丟失這么好的例子。

1 矩陣基本操作

1.1創(chuàng)建向量

R里面有多種方法來創(chuàng)建向量(Vector),最簡(jiǎn)單的是用函數(shù)c()。例如:

>X=c(1,2,3,4)

>X

[1] 1 2 3 4

當(dāng)然,還有別的方法。例如:

>X=1:4

>X

[1] 1 2 3 4

還有seq()函數(shù)。例如:

> X=seq(1,4,length=4)

> X

[1] 1 2 3 4

注意一點(diǎn),R中的向量默認(rèn)為列向量,如果要得到行向量需要對(duì)其進(jìn)行轉(zhuǎn)置。

1.2創(chuàng)建矩陣

R中創(chuàng)建矩陣的方法也有很多。大致分為直接創(chuàng)建和由其它格式轉(zhuǎn)換兩種方法。

1.2.1直接創(chuàng)建矩陣

最簡(jiǎn)單的直接創(chuàng)建矩陣的方法是用matrix()函數(shù),matrix()函數(shù)的使用方法如下:

> args(matrix)

function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

NULL

其中,data參數(shù)輸入的為矩陣的元素,不能為空;nrow參數(shù)輸入的是矩陣的行數(shù),默認(rèn)為1;ncol參數(shù)輸入的是矩陣的列數(shù),默認(rèn)為1;byrow參數(shù)控制矩陣元素的排列方式,TRUE表示按行排列,FALSE表示按列排列,默認(rèn)為FALSEdimnames參數(shù)輸入矩陣的行名和列名,可以不輸入,系統(tǒng)默認(rèn)為NULL。例如:

> matrix(1:6,nrow=2,ncol=3,byrow=FALSE)

** [,1] [,2] [,3]**

[1,] 1 3 5

[2,] 2 4 6

改變矩陣的行數(shù)和列數(shù):

> matrix(1:6,nrow=3,ncol=2,byrow=FALSE)

** [,1] [,2]**

[1,] 1 4

[2,] 2 5

[3,] 3 6

改變byrow參數(shù):

> matrix(1:6,nrow=3,ncol=2,byrow=T)

** [,1] [,2]**

[1,] 1 2

[2,] 3 4

[3,] 5 6

設(shè)定矩陣的行名和列名:

> matrix(1:6,nrow=3,ncol=2,byrow=T,dimnames=list(c(“A”,”B”,”C”),c(“boy”,”girl”)))

** boy girl**

A 1 2

B 3 4

C 5 6

1.2.2 由其它格式轉(zhuǎn)換

也可以由其它格式的數(shù)據(jù)轉(zhuǎn)換為矩陣,此時(shí)需要用到函數(shù)as.matrix()

1.3 查看和改變矩陣的維數(shù)

矩陣有兩個(gè)維數(shù),即行維數(shù)和列維數(shù)。在R中查看矩陣的行維數(shù)和列維數(shù)可以用函數(shù)dim()。例如:

> X=matrix(1:12,ncol=3,nrow=4)

> X

** [,1] [,2] [,3]**

[1,] 1 5 9

[2,] 2 6 10

[3,] 3 7 11

[4,] 4 8 12

> dim(X)

[1] 4 3

只返回行維數(shù):

> dim(X)[1]

[1] 4

也可以用函數(shù)nrow()

> nrow(X)

[1] 4

只返回列維數(shù):

> dim(X)[2]

[1] 3

也可以用函數(shù)ncol():

> ncol(X)

[1] 3

同時(shí),函數(shù)dim()也可以改變矩陣的維數(shù)。例如:

> dim(X)=c(2,6)

> X

** [,1] [,2] [,3] [,4] [,5] [,6]**

[1,] 1 3 5 7 9 11

[2,] 2 4 6 8 10 12

1.4矩陣行列的名稱

查看矩陣的行名和列名分別用函數(shù)rownames()和函數(shù)colnames()。例如:

X=matrix(1:6,nrow=3,ncol=2,byrow=T,dimnames=list(c(“A”,”B”,”C”),c(“boy”,”girl”)))

> X

** boy girl**

A 1 2

B 3 4

C 5 6

查看矩陣的行名:

> rownames(X)

[1] “A” “B” “C”

查看矩陣的列名:

> colnames(X)

[1] “boy” “girl”

同時(shí)也可以改變矩陣的行名和列名,比如:

> rownames(X)=c(“E”,”F”,”G”)

> X

** boy girl**

E 1 2

F 3 4

G 5 6

> colnames(X)=c(“man”,”woman”)

> X

** man woman**

E 1 2

F 3 4

G 5 6

1.5 矩陣元素的查看及其重新賦值

查看矩陣的某個(gè)特定元素,只需要知道該元素的行坐標(biāo)和列坐標(biāo)即可,例如:

> X=matrix(1:12,nrow=4,ncol=3)

> X

** [,1] [,2] [,3]**

[1,] 1 5 9

[2,] 2 6 10

[3,] 3 7 11

[4,] 4 8 12

查看位于矩陣第二行、第三列的元素:

> X[2,3]

[1] 10

也可以重新對(duì)矩陣的元素進(jìn)行賦值,將矩陣第二行、第三列的元素替換為0:

> X[2,3]=0

> X

** [,1] [,2] [,3]**

[1,] 1 5 9

[2,] 2 6 0

[3,] 3 7 11

[4,] 4 8 12

R中有一個(gè)diag()函數(shù)可以返回矩陣的全部對(duì)角元素:

> X=matrix(1:9,ncol=3,nrow=3)

> X

** [,1] [,2] [,3]**

[1,] 1 4 7

[2,] 2 5 8

[3,] 3 6 9

> diag(X)

[1] 1 5 9

當(dāng)然也可以對(duì)對(duì)角元素進(jìn)行重新賦值:

> diag(X)=c(0,0,1)

> X

** [,1] [,2] [,3]**

[1,] 0 4 7

[2,] 2 0 8

[3,] 3 6 1

當(dāng)操作對(duì)象不是對(duì)稱矩陣時(shí),diag()也可以進(jìn)行操作。

> X=matrix(1:12,nrow=4,ncol=3)

> X

** [,1] [,2] [,3]**

[1,] 1 5 9

[2,] 2 6 10

[3,] 3 7 11

[4,] 4 8 12

> diag(X)

[1] 1 6 11

diag()函數(shù)還能用來生成對(duì)角矩陣:

> diag(c(1,2,3))

** [,1] [,2] [,3]**

[1,] 1 0 0

[2,] 0 2 0

[3,] 0 0 3

也可以生成單位對(duì)角矩陣:

> diag(3)

** [,1] [,2] [,3]**

[1,] 1 0 0

[2,] 0 1 0

[3,] 0 0 1

> diag(4)

** [,1] [,2] [,3] [,4]**

[1,] 1 0 0 0

[2,] 0 1 0 0

[3,] 0 0 1 0

[4,] 0 0 0 1

查看矩陣的上三角部分:在R中查看矩陣的上三角和下三角部分很簡(jiǎn)單??梢酝ㄟ^lower.tri()upper.tir()來實(shí)現(xiàn):

> args(lower.tri)

function (x, diag = FALSE)

NULL

> args(upper.tri)

function (x, diag = FALSE)

NULL

查看上三角:

> X=matrix(1:12,nrow=4,ncol=3)

> X

** [,1] [,2] [,3]**

[1,] 1 5 9

[2,] 2 6 10

[3,] 3 7 11

[4,] 4 8 12

> X[lower.tri(X)]

[1] 2 3 4 7 8 12

改變賦值:

> X[lower.tri(X)]=0

> X

** [,1] [,2] [,3]**

[1,] 1 5 9

[2,] 0 6 10

[3,] 0 0 11

[4,] 0 0 0

2 矩陣計(jì)算

2.1矩陣轉(zhuǎn)置

R中矩陣的轉(zhuǎn)置可以用t()函數(shù)完成,例如:

> X=matrix(1:12,nrow=4,ncol=3)

> X

** [,1] [,2] [,3]**

[1,] 1 5 9

[2,] 2 6 10

[3,] 3 7 11

[4,] 4 8 12

> t(X)

** [,1] [,2] [,3] [,4]**

[1,] 1 2 3 4

[2,] 5 6 7 8

[3,] 9 10 11 12

2.2矩陣的行和與列和及行平均值和列均值

R中很容易計(jì)算一個(gè)矩陣的各行和和各列和以及各行的平均值和各列的平均值。例如:

> A=matrix(1:12,3,4)

> A

** [,1] [,2] [,3] [,4]**

[1,] 1 4 7 10

[2,] 2 5 8 11

[3,] 3 6 9 12

> rowSums(A)

[1] 22 26 30

> rowMeans(A)

[1] 5.5 6.5 7.5

> colSums(A)

[1] 6 15 24 33

> colMeans(A)

[1] 2 5 8 11

2.3行列式的值

R中的函數(shù)det()將計(jì)算方陣A的行列式。例如:

> X=matrix(rnorm(9),nrow=3,ncol=3)

> X

** [,1] [,2] [,3]**

[1,] 0.05810412 -1.2992698 0.5630315

[2,] -0.28070583 0.1958623 -1.8202283

[3,] 0.83691209 0.4411497 1.0014306

> det(X)

[1] 1.510076

2.4矩陣相加減

矩陣元素的相加減是指維數(shù)相同的矩陣,處于同行和同列的位置的元素進(jìn)行加減。實(shí)現(xiàn)這個(gè)功能用“”,“”即可。例如:

> A=B=matrix(1:12,nrow=3,ncol=4)

> A+B

** [,1] [,2] [,3] [,4]**

[1,] 2 8 14 20

[2,] 4 10 16 22

[3,] 6 12 18 24

> A-B

** [,1] [,2] [,3] [,4]**

[1,] 0 0 0 0

[2,] 0 0 0 0

[3,] 0 0 0 0

2.5矩陣的數(shù)乘

矩陣的數(shù)乘是指一個(gè)常數(shù)與一個(gè)矩陣相乘。設(shè)Am****×****n矩陣,c****≠****0,在R中求cA的值,可以用符號(hào)“*”。例如:

> c=2

> A=matrix(1:12,nrow=3,ncol=4)

> A

** [,1] [,2] [,3] [,4]**

[1,] 1 4 7 10

[2,] 2 5 8 11

[3,] 3 6 9 12

> cA*

** [,1] [,2] [,3] [,4]**

[1,] 2 8 14 20

[2,] 4 10 16 22

[3,] 6 12 18 24

結(jié)果矩陣與原矩陣的所有相應(yīng)元素都差一個(gè)常數(shù)c。

2.6矩陣相乘

2.6.1矩陣的乘法

A****為****m****×****n矩陣,Bn******×******k矩陣,在R中求AB,可以符號(hào)“%%****”*。例如:

> A=matrix(1:12,nrow=3,ncol=4)

> B=matrix(1:12,nrow=4,ncol=3)

> A%%B*

[,1] [,2] [,3]

[1,] 70 158 246

[2,] 80 184 288

[3,] 90 210 330

注意BA無意義,因其不符合矩陣的相乘規(guī)則。

An****×****m矩陣,Bn******×******k矩陣,在R中求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,] 30 70 110

[2,] 70 174 278

[3,] 110 278 446

也可以用函數(shù)crossprod()計(jì)算A’B

> crossprod(A,B)

** [,1] [,2] [,3]**

[1,] 30 70 110

[2,] 70 174 278

[3,] 110 278 446

2.6.2矩陣的Kronecker積

n****×m矩陣Ah****×k矩陣B的Kronecker積是一個(gè)nh****×mk維矩陣,公式為:

** a-11B ****… a1nB**

Am****×n****×****Bh****×k= ****… ****…

** am1B ****… amnB mh****×nk**

R中Kronecker積可以用函數(shù)kronecher()來計(jì)算。例如:

> A=matrix(1:4,2,2)

> A

** [,1] [,2]**

[1,] 1 3

[2,] 2 4

> B=matrix(rep(1,4),2,2)

> B

** [,1] [,2]**

[1,] 1 1

[2,] 1 1

> kronecker(A,B)

** [,1] [,2] [,3] [,4]**

[1,] 1 1 3 3

[2,] 1 1 3 3

[3,] 2 2 4 4

[4,] 2 2 4 4

2.7矩陣的伴隨矩陣

求矩陣A的伴隨矩陣可以用LoopAnalyst包中的函數(shù)make.adjoint()函數(shù)。例如:

>install.packages(“LoopAnalyst”)

> A=matrix(1:12,nrow=3,ncol=4)

> A

** [,1] [,2] [,3] [,4]**

[1,] 1 4 7 10

[2,] 2 5 8 11

[3,] 3 6 9 12

> make.adjoint(A)

** [,1] [,2] [,3]**

[1,] -3 6 -3

[2,] 6 -12 6

[3,] -3 6 -3

2.8矩陣的逆和廣義逆

2.8.1矩陣的逆

矩陣A的逆A-1可以用函數(shù)solve(),例如:

> A=matrix(rnorm(9),nrow=3,ncol=3)

> A

** [,1] [,2] [,3]**

[1,] -0.2915845 0.2831544 0.94493154

[2,] -1.6494678 0.6999185 -0.06292334

[3,] -0.7224015 -0.3906971 0.44799963

> solve(A)

** [,1] [,2] [,3]**

[1,] 0.2359821 -0.4050650 -0.5546321

[2,] 0.6405592 0.4507583 -1.2877720

[3,] 0.9391490 -0.2600663 0.2147417

驗(yàn)證AA-1=1****:

> A%%solve(A)*

** [,1] [,2] [,3]**

[1,] 1.000000e+00 8.433738e-17 -1.341700e-18

[2,] 1.216339e-17 1.000000e+00 -4.667152e-17

[3,] -2.203641e-17 4.283954e-17 1.000000e+00

round函數(shù)可以更好的得到結(jié)果:

> round(A%%solve(A))*

** [,1] [,2] [,3]**

[1,] 1 0 0

[2,] 0 1 0

[3,] 0 0 1

solve()函數(shù)也可以用來求解方程組ax=b****。

2.8.2矩陣的廣義逆(Moore-Penrose)

并非所有的矩陣都有逆,但是所有的矩陣都可有廣義逆。n****×m矩陣A+是矩陣AMoore-Penrose逆,如果它滿足下列條件:

AA+A=A

A+AA+=A+

(AA+)T=AA+

(A+A)T=A+A

RMASS包中的ginv()函數(shù)可以計(jì)算矩陣的Moore-Penrose逆。例如:

> library(MASS)

> A=matrix(1:12,nrow=3,ncol=4)

> A

** [,1] [,2] [,3] [,4]**

[1,] 1 4 7 10

[2,] 2 5 8 11

[3,] 3 6 9 12

> solve(A)

Error in solve.default(A) : only square matrices can be inverted

> ginv(A)

** [,1] [,2] [,3]**

[1,] -0.483333333 -0.03333333 0.41666667

[2,] -0.244444444 -0.01111111 0.22222222

[3,] -0.005555556 0.01111111 0.02777778

[4,] 0.233333333 0.03333333 -0.16666667

驗(yàn)證性質(zhì)①:

> A%%ginv(A)%%A**

** [,1] [,2] [,3] [,4]**

[1,] 1 4 7 10

[2,] 2 5 8 11

[3,] 3 6 9 12

> A

** [,1] [,2] [,3] [,4]**

[1,] 1 4 7 10

[2,] 2 5 8 11

[3,] 3 6 9 12

驗(yàn)證性質(zhì)②:

> ginv(A)%%A%%ginv(A)**

** [,1] [,2] [,3]**

[1,] -0.483333333 -0.03333333 0.41666667

[2,] -0.244444444 -0.01111111 0.22222222

[3,] -0.005555556 0.01111111 0.02777778

[4,] 0.233333333 0.03333333 -0.16666667

> ginv(A)

** [,1] [,2] [,3]**

[1,] -0.483333333 -0.03333333 0.41666667

[2,] -0.244444444 -0.01111111 0.22222222

[3,] -0.005555556 0.01111111 0.02777778

[4,] 0.233333333 0.03333333 -0.16666667

驗(yàn)證性質(zhì)③:

> A%%ginv(A)*

** [,1] [,2] [,3]**

[1,] 0.8333333 0.3333333 -0.1666667

[2,] 0.3333333 0.3333333 0.3333333

[3,] -0.1666667 0.3333333 0.8333333

> t(A%%ginv(A))*

** [,1] [,2] [,3]**

[1,] 0.8333333 0.3333333 -0.1666667

[2,] 0.3333333 0.3333333 0.3333333

[3,] -0.1666667 0.3333333 0.8333333

驗(yàn)證性質(zhì)④:

> ginv(A)%%A*

** [,1] [,2] [,3] [,4]**

[1,] 0.7 0.4 0.1 -0.2

[2,] 0.4 0.3 0.2 0.1

[3,] 0.1 0.2 0.3 0.4

[4,] -0.2 0.1 0.4 0.7

> t(ginv(A)%%A)*

** [,1] [,2] [,3] [,4]**

[1,] 0.7 0.4 0.1 -0.2

[2,] 0.4 0.3 0.2 0.1

[3,] 0.1 0.2 0.3 0.4

[4,] -0.2 0.1 0.4 0.7

也可以不必如此麻煩來驗(yàn)證性質(zhì)③和④,因?yàn)棰酆廷苤皇潜砻?strong>AA+和A+A是對(duì)稱矩陣。

2.8.3 X’X的逆

很多時(shí)候,我們需要計(jì)算形如X’X的逆。這很容易實(shí)現(xiàn),例如:

> x=matrix(rnorm(9),ncol=3,nrow=3)

> x

** [,1] [,2] [,3]**

[1,] -0.1806586 -0.76340512 0.002652331

[2,] -1.8018584 0.04467943 1.416332187

[3,] 1.2785359 -1.31653513 0.180653002

> solve(crossprod(x))

** [,1] [,2] [,3]**

[1,] 1.2181837 0.9664576 1.470940

[2,] 0.9664576 1.2010110 1.204599

[3,] 1.4709402 1.2045986 2.269921

R中的strucchange包中的函數(shù)solveCrossprod()也可完成:

> args(solveCrossprod)

function (X, method = c(“qr”, “chol”, “solve”))

NULL

> solveCrossprod(x,method=”qr”)

** [,1] [,2] [,3]**

[1,] 1.2181837 0.9664576 1.470940

[2,] 0.9664576 1.2010110 1.204599

[3,] 1.4709402 1.2045986 2.269921

> solveCrossprod(x,method=”chol”)

** [,1] [,2] [,3]**

[1,] 1.2181837 0.9664576 1.470940

[2,] 0.9664576 1.2010110 1.204599

[3,] 1.4709402 1.2045986 2.269921

> solveCrossprod(x,method=”solve”)

[,1] [,2] [,3]

[1,] 1.2181837 0.9664576 1.470940

[2,] 0.9664576 1.2010110 1.204599

[3,] 1.4709402 1.2045986 2.269921

2.9矩陣的特征值和特征向量

可以通過對(duì)矩陣A進(jìn)行譜分解來得到矩陣的特征值和特征向量。矩陣A的譜分解如下:A=U****Λ****U’,其中U的列為A的特征值所對(duì)應(yīng)的特征向量,在R中可以用eigen()函數(shù)得到UΛ。例如:

> args(eigen)

function (x, symmetric, only.values = FALSE, EISPACK = FALSE)

NULL

其中,x參數(shù)輸入矩陣;symmetric參數(shù)判斷矩陣是否為對(duì)稱矩陣,如果參數(shù)為空,系統(tǒng)將自動(dòng)檢測(cè)矩陣的對(duì)稱性。例如:

> A=matrix(1:9,nrow=3,ncol=3)

> A

** [,1] [,2] [,3]**

[1,] 1 4 7

[2,] 2 5 8

[3,] 3 6 9

> Aeigen=eigen(A)

> Aeigen

$values

[1] 1.611684e+01 -1.116844e+00 -4.054214e-16

$vectors

** [,1] [,2] [,3]**

[1,] -0.4645473 -0.8829060 0.4082483

[2,] -0.5707955 -0.2395204 -0.8164966

[3,] -0.6770438 0.4038651 0.4082483

得到矩陣A的特征值:

> Aeigen$values

[1] 1.611684e+01 -1.116844e+00 -4.054214e-16

得到矩陣A的特征向量:

> Aeigen$vectors

** [,1] [,2] [,3]**

[1,] -0.4645473 -0.8829060 0.4082483

[2,] -0.5707955 -0.2395204 -0.8164966

[3,] -0.6770438 0.4038651 0.4082483

3 矩陣高級(jí)操作

3.1 Choleskey分解

對(duì)于正定矩陣A,可以對(duì)其進(jìn)行Choleskey分解,A=P’P,其中P為上三角矩陣,在R中可以用函數(shù)chol()。例如:

> A=diag(3)+1

> A

** [,1] [,2] [,3]**

[1,] 2 1 1

[2,] 1 2 1

[3,] 1 1 2

> chol(A)

** [,1] [,2] [,3]**

[1,] 1.414214 0.7071068 0.7071068

[2,] 0.000000 1.2247449 0.4082483

[3,] 0.000000 0.0000000 1.1547005

驗(yàn)證A=P’P****:

> t(chol(A))%%chol(A)*

** [,1] [,2] [,3]**

[1,] 2 1 1

[2,] 1 2 1

[3,] 1 1 2

也可以用crossprod()函數(shù)

> crossprod(chol(A),chol(A))

** [,1] [,2] [,3]**

[1,] 2 1 1

[2,] 1 2 1

[3,] 1 1 2

可以用Choleskey分解來計(jì)算矩陣的行列式:

> prod(diag(chol(A))^2)

[1] 4

> det(A)

[1] 4

也可以用Choleskey分解來計(jì)算矩陣的逆,這時(shí)候可以用到函數(shù)chol2inv():

> chol2inv(chol(A))

** [,1] [,2] [,3]**

[1,] 0.75 -0.25 -0.25

[2,] -0.25 0.75 -0.25

[3,] -0.25 -0.25 0.75

> solve(A)

** [,1] [,2] [,3]**

[1,] 0.75 -0.25 -0.25

[2,] -0.25 0.75 -0.25

[3,] -0.25 -0.25 0.75

3.2奇異值分解

Am****×n矩陣,矩陣的秩為rA可以分解為A=UDV’,其中U’U=V’V=I。在R中可以用函數(shù)svd()。例如:

> A=matrix(1:18,3,6)

> A

** [,1] [,2] [,3] [,4] [,5] [,6]**

[1,] 1 4 7 10 13 16

[2,] 2 5 8 11 14 17

[3,] 3 6 9 12 15 18

> svd(A)

$d

[1] 4.589453e+01 1.640705e+00 2.294505e-15

$u

** [,1] [,2] [,3]**

[1,] -0.5290354 0.74394551 0.4082483

[2,] -0.5760715 0.03840487 -0.8164966

[3,] -0.6231077 -0.66713577 0.4082483

$v

** [,1] [,2] [,3]**

[1,] -0.07736219 -0.7196003 -0.67039144

[2,] -0.19033085 -0.5089325 0.55766549

[3,] -0.30329950 -0.2982646 0.28189237

[4,] -0.41626816 -0.0875968 0.07320847

[5,] -0.52923682 0.1230711 0.12920119

[6,] -0.64220548 0.3337389 -0.37157608

> A.u%%diag(A.d)%%t(A.v)**

[,1] [,2] [,3] [,4] [,5] [,6]

[1,] 1 4 7 10 13 16

[2,] 2 5 8 11 14 17

[3,] 3 6 9 12 15 18

3.3 QR分解

Am****×****n矩陣可以進(jìn)行QR分解:A=QR,其中Q’Q=I,在R中可以用函數(shù)qr()來完成這個(gè)過程,例如:

> A=matrix(1:12,4,3)

> qr(A)

$qr

** [,1] [,2] [,3]**

[1,] -5.4772256 -12.7801930 -2.008316e+01

[2,] 0.3651484 -3.2659863 -6.531973e+00

[3,] 0.5477226 -0.3781696 7.880925e-16

[4,] 0.7302967 -0.9124744 9.277920e-01

$rank

[1] 2

$qraux

[1] 1.182574 1.156135 1.373098

$pivot

[1] 1 2 3

attr(,”class”)

[1] “qr”

Rank返回的是矩陣的秩。Qr項(xiàng)包含了Q矩陣和R矩陣的信息。要想得到Q矩陣和R矩陣,可以用qr.Q()函數(shù)和qr.R()函數(shù):

> qr.Q(qr(A))

** [,1] [,2] [,3]**

[1,] -0.1825742 -8.164966e-01 -0.4000874

[2,] -0.3651484 -4.082483e-01 0.2546329

[3,] -0.5477226 4.938541e-17 0.6909965

[4,] -0.7302967 4.082483e-01 -0.5455419

> qr.R(qr(A))

** [,1] [,2] [,3]**

[1,] -5.477226 -12.780193 -2.008316e+01

[2,] 0.000000 -3.265986 -6.531973e+00

[3,] 0.000000 0.000000 7.880925e-16

4 解方程組

4.1普通方程組

解普通方程組可以用函數(shù)solve()solve()的基本用法是solve(A,b),其中,A為方程組的系數(shù)矩陣,b為方程組的右端。例如:

已知方程組:

2x1+2x3=1

2x1+x2+2x-3=2

2x1+x-2=3

解法如下:

> A

** [,1] [,2] [,3]**

[1,] 2 0 2

[2,] 2 1 2

[3,] 2 1 0

> b=1:3

>b

[1] 1 2 3

> solve(A,b)

[1] 1.0 1.0 -0.5

即x-1=1,x2=1,x3=-0.5。

4.2 特殊方程組

對(duì)于系數(shù)矩陣是上三角矩陣和下三角矩陣的方程組。R中提供了backsolve()fowardsolve()來解決這個(gè)問題。

backsolve(r, x, k=ncol(r), upper.tri=TRUE, transpose=FALSE)

forwardsolve(l, x, k=ncol(l), upper.tri=FALSE, transpose=FALSE)

這兩個(gè)函數(shù)都是符合操作的函數(shù),大致可以分為三個(gè)步驟:

①通過將系數(shù)矩陣的上三角或者下三角變?yōu)?的到新的系數(shù)矩陣,這通過upper.tri參數(shù)來實(shí)現(xiàn),若upper.tri=TRUR,上三角不為0。

②通過將對(duì)步驟1中得到的新系數(shù)矩陣進(jìn)行轉(zhuǎn)置得到新的系數(shù)矩陣,這通過transpose參數(shù)實(shí)現(xiàn),若transpose=FALSE,則步驟1中得到的系數(shù)矩陣將被轉(zhuǎn)置。

③根據(jù)步驟2得到的系數(shù)矩陣來解方程組。

X1+4X2+7X3=1

2X1+5X2+8X3=2

3X1+6X2+9X3=3

方程組的系數(shù)矩陣為:

> A

** [,1] [,2] [,3]**

[1,] 1 4 7

[2,] 2 5 8

[3,] 3 6 9

> b

[1] 1 2 3

> backsolve(A,b,upper.tri=T,transpose=F)

[1] -0.8000000 -0.1333333 0.3333333

過程分解:

①upper.tri=T,說明系數(shù)矩陣的上三角不為0。

> B=A

> B[lower.tri(B)]=0

> B

** [,1] [,2] [,3]**

[1,] 1 4 7

[2,] 0 5 8

[3,] 0 0 9

②transpose=F說明系數(shù)矩陣未被轉(zhuǎn)置。

③解方程:

> solve(B,b)

[1] -0.8000000 -0.1333333 0.3333333

5 其它

5.1矩陣的向量化

將矩陣向量化有時(shí)候是必要的。矩陣的向量化可以通過as.vector()來實(shí)現(xiàn):

> A

** [,1] [,2] [,3] [,4]**

[1,] 1 4 7 10

[2,] 2 5 8 11

[3,] 3 6 9 12

將矩陣元素向量化:

> as.vector(A)

** [1] 1 2 3 4 5 6 7 8 9 10 11 12**

將矩陣的方陣部分元素向量化:

> as.vector(A[1:min(dim(A)),1:min(dim(A))])

[1] 1 2 3 4 5 6 7 8 9

5.2矩陣的合并

5.2.1矩陣的列合并

矩陣的列合并可以通過cbind()來實(shí)現(xiàn)。

> A

** [,1] [,2] [,3]**

[1,] 1 4 7

[2,] 2 5 8

[3,] 3 6 9

> B=1:3

> cbind(A,B)

** B**

[1,] 1 4 7 1

[2,] 2 5 8 2

[3,] 3 6 9 3

5.2.2矩陣的行合并

矩陣的行合并可以通過rbind()來實(shí)現(xiàn)。

> A

** [,1] [,2] [,3]**

[1,] 1 4 7

[2,] 2 5 8

[3,] 3 6 9

> B=1:3

> rbind(A,B)

** [,1] [,2] [,3]**

** 1 4 7**

** 2 5 8**

** 3 6 9**

B 1 2 3

5.3 時(shí)序矩陣的滯后

在時(shí)間序列中經(jīng)常會(huì)用到一個(gè)序列的滯后序列,R中的包fMultivar中的函數(shù)tslag()提供了這個(gè)功能。

> library(fMultivar)

Loading required package: sn

Loading required package: mnormt

Package ‘sn’, 0.4-16 (2010-08-30). Type ‘help(SN)’ for summary information

Loading required package: timeDate

Loading required package: timeSeries

Loading required package: fBasics

Loading required package: MASS

Attaching package: ‘fBasics’

The following object(s) are masked from ‘package:base’:

** norm**

> args(tslag)

function (x, k = 1, trim = FALSE)

NULL

其中:x為一個(gè)向量,k指定滯后階數(shù),可以是一個(gè)自然數(shù)列,若trim為假,則返回序列與原序列長(zhǎng)度相同,但含有NA值;若trim項(xiàng)為真,則返回序列中不含有NA值,例如:

> x=1:9

> x

[1] 1 2 3 4 5 6 7 8 9

> tslag(x,1:4,trim=F)

** [,1] [,2] [,3] [,4]**

** [1,] NA NA NA NA**

** [2,] 1 NA NA NA**

** [3,] 2 1 NA NA**

** [4,] 3 2 1 NA**

** [5,] 4 3 2 1**

** [6,] 5 4 3 2**

** [7,] 6 5 4 3**

** [8,] 7 6 5 4**

** [9,] 8 7 6 5**

> tslag(x,1:4,trim=T)

** [,1] [,2] [,3] [,4]**

[1,] 4 3 2 1

[2,] 5 4 3 2

[3,] 6 5 4 3

[4,] 7 6 5 4

[5,] 8 7 6 5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容