R语言matrix运算

### 1. 矩阵创建
# M <- matrix(1:12,3,4)
# args(matrix)
M <- matrix(sample(0:1000,1000,replace=TRUE),nrow=100,ncol=10,
            dimnames=list(paste0('g',1:100),paste0('s',1:10)))
nrow(M)
ncol(M)
rownames(M)
colnames(M)

A=1:15
class(A) # [1] "integer"
dim(A)=c(3,5)
class(A) # [1] "matrix" "array" 

### 2. 矩阵转置
M <- matrix(1:15,nrow=3,ncol=5)
t(M) # 转置,行列互换

## 向量转置后变矩阵
x <- 1:15
X <- t(x) # 只有一列的矩阵
class(X)  # [1] "matrix" "array"

class(t(X)) # 还是矩阵
### 3.矩阵求逆
M <- matrix(rnorm(9),nrow=3,ncol=3) 

# solve(a, b)运算结果是解线性方程组ax = b,
# 若b缺省,则系统默认为单位矩阵,因此可用其进行矩阵求逆
solve(M) # 要求是方阵

solve(M) %*% M   # %*%  矩阵乘法运算符

### 4. 矩阵元素加减乘除
M1 <- matrix(rnorm(9,10,1),nrow=3,ncol=3)
M2 <- matrix(rnorm(9,10,1),nrow=3,ncol=3)
M1 + M2; M1 - M2; M1 / M2;
round(M1 * M2, 2) #  对应元素相乘
M1 + 6; M1 - 6; M1 * 6; M1 / 6;

### 5. 矩阵相乘
A <- matrix(1:15,nrow=3,ncol=5)
B <- matrix(1:15,nrow=5,ncol=3)

A %*% B # A矩阵列数等于B矩阵的行数

### 6. 内积和外积
A1 <- matrix(rnorm(15),nrow=3,ncol=5)
A2 <- matrix(rnorm(15),nrow=3,ncol=5)
#dim(A1) # [1] 3 5
#dim(A2) # [1] 3 5
A3 <- crossprod(A1,A2) # 内积
#dim(A3) # [1] 5 5
A4 <- t(A1) %*% A2
identical(A3,A4)

tcrossprod(A1,A2) # 外积
identical(tcrossprod(A1,A2),A1 %*% t(A2))

(z <- crossprod(1:4))    # = sum(1 + 2^2 + 3^2 + 4^2)
drop(z)                  # 删除只有一个级别的数组的维度。scalar
x <- 1:4; names(x) <- letters[1:4]; x
tcrossprod(as.matrix(x)) # is
identical(tcrossprod(as.matrix(x)),
          crossprod(t(x)))
tcrossprod(x)            # no dimnames

m <- matrix(1:6, 2,3) ; v <- 1:3; v2 <- 2:1
stopifnot(identical(tcrossprod(v, m), v %*% t(m)),
          identical(tcrossprod(v, m), crossprod(v, t(m))),
          identical(crossprod(m, v2), t(m) %*% v2))

### 7.行列统计
A <- matrix(rnorm(15),nrow=3,ncol=5)
rowSums(A)
rowMeans(A)
colSums(A)
colMeans(A)

normalize <- function(x){
    return ((x-min(x))/(max(x)-min(x)))
}

apply(A,2,normalize) # 按列进行处理


### 8.对角阵
# 提取或替换矩阵的对角线,或构造对角线矩阵。
diag(1,nrow=3,ncol=3)
diag(c(5,9,12,6),nrow=4,ncol=4)
A <- matrix(1:9,nrow=3,ncol=3)
diag(A) # 提取A的对角线元素
diag(diag(A))


### 9. 子矩阵
A <- matrix(1:15,nrow=3,ncol=5)
A[1:2,1:3]
#取矩阵的上、下三角部分
lower.tri(A) # 返回TRUE FALSE矩阵
lower.tri(A,diag=T) # 加上对角线上的元素
A[lower.tri(A)]=0

upper.tri(A)
upper.tri(A,diag=T)
A[upper.tri(A,diag=T)]=0

### 10.矩阵的特征值与特征向量
# 矩阵A的谱分解为A=UΛU‘,其中Λ是由A的特征值组成的对角矩阵,
# U的列为A的特征值对应的特征向量
## 要求是方阵
M1 <- matrix(1:25,nrow=5,ncol=5)
eigen1=eigen(M1,symmetric=T)
eigen2=eigen(M1)

### 11.矩阵广义逆
library("MASS")
M1 <- matrix(1:15,nrow=3,ncol=5) 
dim(M1) #[1] 3 5
M2 <- ginv(M1)
dim(M2) #[1] 5 3

identical(M1%*%ginv(M1)%*%M1,M1) #[1] FALSE
# M1%*%ginv(M1)%*%M1 近似等于M1

identical(ginv(M1)%*%M1%*%ginv(M1),ginv(M1)) #[1] FALSE
# ginv(M1)%*%M1%*%ginv(M1) 近似等于ginv(M1)

identical(t(M1%*%ginv(M1)),M1%*%ginv(M1)) #[1] FALSE
# t(M1%*%ginv(M1))近似等于M1%*%ginv(M1)

identical(t(ginv(M1)%*%M1),ginv(M1)%*%M1) #[1] FALSE
# t(ginv(M1)%*%M1)近似等于 ginv(M1)%*%M1

### 11.矩阵奇异值分解
M <- matrix(1:15,nrow=3,ncol=5) 
svd(M)

### 12.矩阵QR分解
M <- matrix(1:15,nrow=3,ncol=5) 
qr(M)
qr.R(qr(M)) # 矩阵R
qr.Q(qr(M)) # 矩阵Q

### 13.矩阵行列式
# 必需是方阵
M <- matrix(rnorm(25),nrow=5,ncol=5) 
det(M)

(x <- matrix(1:4, ncol = 2))
unlist(determinant(x))
det(x)

det(print(cbind(1, 1:3, c(2,0,1))))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值