yijiaobai的个人博客分享 http://blog.sciencenet.cn/u/yijiaobai

博文

R语言常用的矩阵操作

已有 4011 次阅读 2017-12-23 15:08 |个人分类:农学统计|系统分类:科研笔记

1.1 矩阵的生成

生成一个4行4列的矩阵,这里用1~16数字。

mat <- matrix(1:16,4,4)

mat

图片.png

1.2 提取主对角线

diag(mat)

图片.png

1.3 生成对角线为1的对角矩阵

m1 <- diag(4)

m1

图片.png

1.4 提取矩阵的下三角

mat[lower.tri(mat)]

图片.png

1.5 提取矩阵上三角

mat[upper.tri(mat)]

图片.png

1.6 以矩阵下三角构建对角矩阵

mat1 <- mat

mat1[upper.tri(mat1)] <- t(mat1)[upper.tri(mat1)]

原矩阵mat:

mat

图片.png

变换后的对角矩阵

mat1

图片.png

1.7 将矩阵转化为行列形式

原矩阵,生成三列:行,列,值

mat

图片.png

相关代码

nrow <- dim(mat)[1]

ncol <- dim(mat)[2]

row <- rep(1:nrow,ncol)

col <- rep(1:ncol, each=nrow)

frame <- data.frame(row,col,value =as.numeric(mat))

frame

图片.png

1.8 将三列形式转化为矩阵

    nrow <- max(frame[, 1])

    ncol <- max(frame[, 2])

    y <- rep(0, nrow * ncol)

    y[(frame[, 2] - 1) * nrow + frame[, 1]] <- frame[, 3]

    y[(frame[, 1] - 1) * nrow + frame[, 2]] <- frame[, 3]

    matrix(y, nrow = nrow, ncol = ncol, byrow = T)

图片.png

1.9 将矩阵转置

t(mat)

图片.png

2.1 矩阵相加减

A=B=matrix(1:16,nrow=4,ncol=4)

A + B

图片.png

A - B

图片.png

2.2 数与矩阵相乘

c <- 2c*A

图片.png

3.3 矩阵相乘

A 为m × n矩阵,B为n× k矩阵,用符合“%*%”

A <- matrix(1:12,3,4)

B <- matrix(1:20,4,5)

A%*%B

图片.png

3.4 计算t(A)%*%B的方法

第一种,直接计算

A <- matrix(1:12,3,4)

B <- matrix(1:15,3,5)

t(A)%*%B

图片.png

第二种方法,用crossprod函数,数据量大时效率更高

A <- matrix(1:12,3,4)

B <- matrix(1:15,3,5)

crossprod(A,B)

图片.png

3.5 矩阵求逆

a <- matrix(rnorm(16),4,4)

solve(a)

图片.png

矩阵与其逆矩阵的乘积为对角矩阵

round(solve(a)%*%a)

图片.png

3.6 矩阵的广义逆矩阵

对于奇异阵,并不存在逆矩阵,但是可以计算其广义逆矩阵

a <- matrix(1:16,4,4)

solve(a)

图片.png

显示矩阵奇异,这里可以使用MASS包的ginv计算其广义逆矩阵

library(MASS)

a <- matrix(1:16,4,4)

ginv(a)

图片.png

3.7 矩阵的直积(Kronecker,克罗内克积),使用函数kronecker计算

图片.png

假设A为2X2矩阵

A <- matrix(c(10,5,5,20),2,2)

A

图片.png

假设B为3X3矩阵

B <- matrix(c(1,0,2,0,1,4,2,4,1),3,3)

B

图片.png

则A和B的直积就是6X6的矩阵

kronecker(A,B)

图片.png

3.8 矩阵的直和(direct sum)

图片.png

图片.png

A <- matrix(c(1,2,3,3,2,1),2,3)

A

B <- matrix(c(1,0,6,1),2,2)

B

图片.png

r1 <- dim(A)[1];c1 <- dim(A)[2]

r2 <- dim(B)[1];c2 <- dim(B)[2]

direct_sum <- rbind(cbind(A,matrix(0,r2,c2)),cbind(matrix(0,r1,c1),B))

direct_sum

图片.png



http://blog.sciencenet.cn/blog-2577109-1091109.html

上一篇:如何用logistic回归曲线拟合日照和生物量积累的模型
下一篇:用矩阵的方法计算回归分析参数

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2019-4-19 05:10

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部