热线电话:13121318867

登录
2018-11-01 阅读量: 807
用R进行矩阵运算(5)

16 矩阵的行和、列和、行平均与列平均

在R中很容易求得一个矩阵的各行的和、平均数与列的和、平均数,例如:

> 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

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,] 0.6132102 -0.1543924 -0.2900796 0.2054730

[2,] -0.1543924 0.4779277 0.1859490 -0.2097302

[3,] -0.2900796 0.1859490 0.6931232 -0.3162961

[4,] 0.2054730 -0.2097302 -0.3162961 0.3447627

> solveCrossprod(A,method="chol")

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

[1,] 0.6132102 -0.1543924 -0.2900796 0.2054730

[2,] -0.1543924 0.4779277 0.1859490 -0.2097302

[3,] -0.2900796 0.1859490 0.6931232 -0.3162961

[4,] 0.2054730 -0.2097302 -0.3162961 0.3447627

> solveCrossprod(A,method="solve")

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

[1,] 0.6132102 -0.1543924 -0.2900796 0.2054730

[2,] -0.1543924 0.4779277 0.1859490 -0.2097302

[3,] -0.2900796 0.1859490 0.6931232 -0.3162961

[4,] 0.2054730 -0.2097302 -0.3162961 0.3447627

> solve(crossprod(A,A))

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

[1,] 0.6132102 -0.1543924 -0.2900796 0.2054730

[2,] -0.1543924 0.4779277 0.1859490 -0.2097302

[3,] -0.2900796 0.1859490 0.6931232 -0.3162961

[4,] 0.2054730 -0.2097302 -0.3162961 0.3447627

18 取矩阵的上、下三角部分

在R中,我们可以很方便的取到一个矩阵的上、下三角部分的元素,函数lower.tri()

和函数upper.tri()提供了有效的方法。

> args(lower.tri)

function (x, diag = FALSE)

函数将返回一个逻辑值矩阵,其中下三角部分为真,上三角部分为假,选项diag为真

时包含对角元素,为假时不包含对角元素。upper.tri()的效果与之孑然相反。例如:

> A

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

[1,] 1 5 9 13

[2,] 2 6 10 14

[3,] 3 7 11 15

[4,] 4 8 12 16

> lower.tri(A)

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

[1,] FALSE FALSE FALSE FALSE

[2,] TRUE FALSE FALSE FALSE

[3,] TRUE TRUE FALSE FALSE

[4,] TRUE TRUE TRUE FALSE

> lower.tri(A,diag=T)

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

[1,] TRUE FALSE FALSE FALSE

[2,] TRUE TRUE FALSE FALSE

[3,] TRUE TRUE TRUE FALSE

[4,] TRUE TRUE TRUE TRUE

> upper.tri(A)

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

[1,] FALSE TRUE TRUE TRUE

[2,] FALSE FALSE TRUE TRUE

[3,] FALSE FALSE FALSE TRUE

[4,] FALSE FALSE FALSE FALSE

> upper.tri(A,diag=T)

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

[1,] TRUE TRUE TRUE TRUE

[2,] FALSE TRUE TRUE TRUE

[3,] FALSE FALSE TRUE TRUE

[4,] FALSE FALSE FALSE TRUE

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

> A

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

[1,] 1 5 9 13

[2,] 0 6 10 14

[3,] 0 0 11 15

[4,] 0 0 0 16

> A[upper.tri(A)]=0

> A

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

[1,] 1 0 0 0

[2,] 2 6 0 0

[3,] 3 7 11 0

[4,] 4 8 12 16

19 backsolve&fowardsolve函数

这两个函数用于解特殊线性方程组,其特殊之处在于系数矩阵为上或下三角。

> args(backsolve)

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

> args(forwardsolve)

function (l, x, = ncol(l), upper.tri = FALSE, transpose = FALSE)upper.tri =F transpose= T

11

upper.tri =F transpose=F

例如:

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

> A

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

[1,] 1 4 7

[2,] 2 5 8

[3,] 3 6 9

> x=c(1,2,3)

> x

[1] 1 2 3

> B=A

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

> B

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

[1,] 1 0 0

[2,] 2 5 0

[3,] 3 6 9

> C=A

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

> C

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

[1,] 1 4 7

[2,] 0 5 8

[3,] 0 0 9

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

[1] 1.00000000 -0.40000000 -0.08888889

> solve(t(C),x)

[1] 1.00000000 -0.40000000 -0.08888889

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

[1] -0.8000000 -0.1333333 0.3333333

> solve(C,x)

[1] -0.8000000 -0.1333333 0.3333333

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

[1] 1.111307e-17 2.220446e-17 3.333333e-01

> solve(t(B),x)

[1] 1.110223e-17 2.220446e-17 3.333333e-01

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

[1] 1 0 0

> solve(B,x)

[1] 1.000000e+00 -1.540744e-33 -1.850372e-17

upper.tri =F transpose=F

例如:

> A

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

[1,] 1 4 7

[2,] 2 5 8

[3,] 3 6 9

> B

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

[1,] 1 0 0

[2,] 2 5 0

[3,] 3 6 9

> C

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

[1,] 1 4 7

[2,] 0 5 8

[3,] 0 0 9

> x

[1] 1 2 3

> forwardsolve(A,x,upper.tri=T,transpose=T)

[1] 1.00000000 -0.40000000 -0.08888889

> solve(t(C),x)

[1] 1.00000000 -0.40000000 -0.08888889

> forwardsolve(A,x,upper.tri=T,transpose=F)

[1] -0.8000000 -0.1333333 0.3333333

> solve(C,x)

[1] -0.8000000 -0.1333333 0.3333333

> forwardsolve(A,x,upper.tri=F,transpose=T)

[1] 1.111307e-17 2.220446e-17 3.333333e-01

> solve(t(B),x)

[1] 1.110223e-17 2.220446e-17 3.333333e-01

> forwardsolve(A,x,upper.tri=F,transpose=F)

[1] 1 0 0

> solve(B,x)

[1] 1.000000e+00 -1.540744e-33 -1.850372e-17

0.0000
2
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子