R语言矩阵与数组

最后发布时间:2020-05-31 18:48:00 浏览量:

矩阵的创建

ysw <- matrix(c(94,98,85,85,97,95,
                  96,98,96,96,98,95,
                  95,98,85,82,96,93),
                ncol = 3,
                dimnames = list(
                  c("张三","李四","王五","悟空","八戒","沙僧"),
                  c("yw","sx","wy")
                )
              ) # 按列填充
ysw

ysw <- matrix(c(94,98,85,85,97,95,
                96,98,96,96,98,95,
                95,98,85,82,96,93),
              ncol = 3) # 按列填充
colnames(ysw)<-c("yw","sx","wy")
row.names(ysw) <- c("张三","李四","王五","悟空","八戒","沙僧")
ysw
# yw sx wy
# 张三 94 96 95
# 李四 98 98 98
# 王五 85 96 85
# 悟空 85 96 82
# 八戒 97 98 96
# 沙僧 95 95 93

ysw <- matrix(c(94,96,95,
                98,98,98,
                85,96,85,
                85,96,82,
                97,98,96,
                95,95,93),
              byrow = TRUE,# 按行填充
              ncol = 3) 
colnames(ysw)<-c("yw","sx","wy")
row.names(ysw) <- c("张三","李四","王五","悟空","八戒","沙僧")
ysw
# yw sx wy
# 张三 94 96 95
# 李四 98 98 98
# 王五 85 96 85
# 悟空 85 96 82
# 八戒 97 98 96
# 沙僧 95 95 93

矩阵的基本性质

colnames(ysw)
# [1] "yw" "sx" "wy"
row.names(ysw)
# [1] "张三" "李四" "王五" "悟空" "八戒" "沙僧"
nrow(ysw) # [1] 6
ncol(ysw) # [1] 3
dim(ysw) # [1] 6 3
dimnames(ysw)
# [[1]]
# [1] "张三" "李四" "王五" "悟空" "八戒" "沙僧"
# [[2]]
# [1] "yw" "sx" "wy"

矩阵子集的访问

ysw[5,] # 通过下标
ysw['八戒',] # 通过名称
# yw sx wy 
# 97 98 96 
ysw[5,-3]
ysw[5,1:2] # 第一行后两个
# yw sx 
# 97 98

列重排

ysw[,c("sx","yw","wy")]
# sx yw wy
# 张三 96 94 95
# 李四 98 98 98
# 王五 96 85 85
# 悟空 96 85 82
# 八戒 98 97 96
# 沙僧 95 95 93

行重拍

order_sx <- order(ysw[,'sx'],decreasing = TRUE)
order_sx # [1] 2 5 1 3 4 6
ysw[order_sx,]
# yw sx wy
# 李四 98 98 98
# 八戒 97 98 96
# 张三 94 96 95
# 王五 85 96 85
# 悟空 85 96 82
# 沙僧 95 95 93

行叠加

ysw2 <- matrix(c(88,89,89,96,95,96),
               ncol = 3,
               dimnames = list(
                 c("刘备","曹操"),
                 c("yw","sx","wy")
               ))
ysw2
# scff sx wy
# 刘备   88 89 95
# 曹操   89 96 96
rowAdd <- rbind(ysw,ysw2)
rowAdd
# yw sx wy
# 张三 94 96 95
# 李四 98 98 98
# 王五 85 96 85
# 悟空 85 96 82
# 八戒 97 98 96
# 沙僧 95 95 93
# 刘备 88 89 95
# 曹操 89 96 96

列叠加

lszz <- matrix(c(88,98,85,85,97,95,
                96,98,96,96,98,95),
              ncol = 2,
              dimnames = list(
                c("张三","李四","王五","悟空","八戒","沙僧"),
                c("ls","zz")
              )
) 
lszz
# ls zz
# 张三 88 96
# 李四 98 98
# 王五 85 96
# 悟空 85 96
# 八戒 97 98
# 沙僧 95 95
colAdd <- cbind(ysw,lszz)
colAdd
# yw sx wy ls zz
# 张三 94 96 95 88 96
# 李四 98 98 98 98 98
# 王五 85 96 85 85 96
# 悟空 85 96 82 85 96
# 八戒 97 98 96 97 98
# 沙僧 95 95 93 95 95

矩阵统计操作

rowSums(ysw)
apply(ysw, 1,sum)
# 张三 李四 王五 悟空 八戒 沙僧 
# 285  294  266  263  291  283 
colMeans(ysw)
apply(ysw,2 ,mean)
# yw       sx       wy 
# 92.33333 96.50000 91.50000 
apply(ysw,2 ,function(x){
  sd(x)/mean(x)
})
# yw         sx         wy 
# 0.06339827 0.01269166 0.07074340 

apply split->apply-combine: 先分组对每一组操作组合

R解线性方程组

A <- matrix(c(1,2,3,
              2,2,5,
              3,5,1),
            ncol = 3,
            byrow = TRUE)
b <- 1:3
solve(A,b) # [1] 1 0 0

图片alt

图片alt

R与matlab对照

求逆矩阵

An <- diag(3)
# cAn
# [,1] [,2] [,3]
# [1,]    1    0    0
# [2,]    0    1    0
# [3,]    0    0    1
solve(A,An)
# [,1]        [,2]        [,3]
# [1,] -1.5333333  0.86666667  0.26666667
# [2,]  0.8666667 -0.53333333  0.06666667
# [3,]  0.2666667  0.06666667 -0.13333333

solve(A) %*% A # 得到单位矩阵
# [,1]          [,2]          [,3]
# [1,]  1.000000e+00  8.881784e-16  1.054712e-15
# [2,] -4.440892e-16  1.000000e+00 -7.077672e-16
# [3,] -5.551115e-17 -1.110223e-16  1.000000e+00
sqrt(2)^2 == 2 # FALSE
dplyr::near(sqrt(2)^2,2) # TRUE
all(dplyr::near(solve(A) %*% A,diag(3))) # TRUE

数组(以图像为例介绍三维数组)

矩阵本质就是二维数组

图片alt

图片alt

install.packages('imager', repos ="https://mirrors.tuna.tsinghua.edu.cn/CRAN/")

Ubuntu 需要安装 sudo apt-get install libfftw3-dev libtiff5-dev

library(imager)
img1 <- load.image("/home/wy/Pictures/7777777.jpg")
str(img1) # cimg [1:640, 1:427, 1, 1:3]
plot(img1)
img1[,,1]<-0 # 去掉红色图层
img1[,,3]<-0 # 去掉蓝色图层
plot(img1)

图片alt

图片alt

area_coor_x <- 350:449
area_coor_y <- 110:259
array_dim <- c(length(area_coor_x),length(area_coor_y),3)
array_dim # [1] 100 150   3
array_data <- runif(prod(array_dim))
array_data
random_noise <- array(dim = array_dim,data = array_data)
random_noise
img1[area_coor_x,area_coor_y,]<- (1-0.6) * 
          img1[area_coor_x,area_coor_y,]+
          0.6*random_noise
plot(img1)

图片alt

图片alt

注意:硬盘上的任何数据都是R的六种数据(向量,因子,矩阵,数组,数据框,列表)之一