3.1 创建矩阵
y<- matrix(c(1,2,3,4),nrow=2,ncol=2) #R中是按照列进行存储,这就决定了元素的顺序
y <- matrix(c(1,2,3,4),nrow=2) #只需要一个参数就可以
m <- matrix(c(1,2,3,4,5,6),nrow=2,byrow=T) #按照行进行存储
n <- matrix(nrow = 2, ncol = 2) #生成空矩阵
运行结果:
> y
[,1] [,2]
[1,] 1 3
[2,] 2 4
> y
[,1] [,2]
[1,] 1 3
[2,] 2 4
> m
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> n
[,1] [,2]
[1,] NA NA
[2,] NA NA
3.2 一般矩阵运算
3.2.1 矩阵的运算
相乘:%*%
数量乘法:3*y
加法:+
3.2.2 矩阵索引
z <- matrix(1:12,4,3)
z
z[,2:3] #提取第2到3列
z
y <- matrix(1:6,3,2)
y
y[2:3,] #提取2:3行
y
y[2:3,2] #提取2:3行的第2列
y
y(c(1:3),) <- matrix(c(1,1,8,12),nrow = 2) #给子矩阵进行赋值,即y的第1、3行!!!!!!
y
3.2.3 拓展案例:图像操作
1、安装和使用包
自动安装包:
在R语言的窗口中,输入以下命令
install.packages("mvtnorm","a/b/c") #其中a/b/c是安装地址
这会让R自动连接到CRAN下载并编译包,然后加载到相应目录里
列出包中所有的函数:
以下两个任意一个都可以
library(help=mvtnorm)
help(package =mvtnorm)
将包加载到内存中使用
library()
2、具体使用
3.2.4 矩阵元素的筛选
x <- matrix(c(1,2,3,2,3,4),3,2)
j <- x[,2] >=3 #判断x的第二列向量有哪些元素大于等于3并且返回布尔值
m = x[j,] #然后在x中使用,x[j,]的行与向量j中的TRUE相对应
m #输出结果
n = x[x[,2] >=3,]
n
结果:
3.2.5 拓展案例:生成协方差矩阵
如果我们想要用MASS库中的mvrnorm()函数生成多元多态分布的随机数,需要指定协方差矩阵
代码:
makecov <- function(rho, n){
m <- matrix(nrow = n,ncol = n)
m <- ifelse(row(m)== col(m),1,rho)
return(m)
}
makecov(0.7,2)
3.3 对矩阵的行和列调用函数!!!(重要)
apply() 函数允许用户在矩阵的各行或各列上调用指定函数
3.3.1 apply(m,dimcode,f,fargs)
m:是矩阵
dimcode :1表示对行操作,2表示对列操作
f:应用在行或列上的函数
fargs:是f的可选参数集
解释:
z <- matrix(1:4,2,2)
apply(z,2,mean) #对z的每一列求均值输出向量
f <- function(x) x/c(2,8) #f()把一个向量除以(2,8)【如果x的长度大于2,那么(2,8)会循环补齐】
y <- apply(x,1,f)
3.3.2 案例1:返回一个(0,1)矩阵中每行前D个元素中较多的那个(一样多就返回0)
copymaj <- function(rw, d){
maj <- sum(rw[1:d] /d)
return (if (maj >0/5)1 else 0)
}
setwd("D:/Rfiles/project1") #这个是将R语言的指针弄到函数文件的前一个文件包中,在这里是指到桌面
source("copymaj.R",encoding="utf-8")
x <- round(matrix(runif(25),5,5))
apply(x,1,copymaj,2)
3.3.3案例2: 寻找异常值(检测一组数据中与中位数差别最大的观测值)
其中矩阵中的每一行数据为一组数据
#写函数 求出相差最大的序号
findol <- function(xrow) {
mdn <- median(xrow)
devs <- abs(xrow - mdn)
return (which.max(devs))
}
x<- matrix(1:6,nrow = 3)
x
apply(x,1,findol)#返回每一行的最大值的索引位置
结果:
3.4 增加或删除矩阵的行和列
3.4.1 改变矩阵的大小
通过直接赋值的方法:
m <- matrix(1:6,nrow=3)
m
m<- m[c(1,3),]
m
结果:
运用rbind()【按行组合】和cbind()【按列组合】:
rbind()--row bind,cbind()--column bind,当m的数少时会循环补齐,当多时会报错
m <- c(1,2)
z <- matrix(1:6,nrow = 3)
l <- rbind(m,z)
注意:运用cbind和rbind都是开发了新空间会造成资源的浪费,在一般的实验中常常先创建好一个空的大矩阵然后进行赋值
3.4.2 拓展案例:找到图中距离最近的一对端点
imin <- function(x){ #x是矩阵的某一行
lx <- length(x)
i <- x[lx] #对后一个元素,就是行号
j <- which.min(x[(i+1):(lx-1)]) #返回一个行号 #上三角的元素,对角线都是0不用管
k <- i+j #j不是整体的列号,加上行号就会得到证实的列好
return (c(k,x[k])) #K是列好,x[k]是值
}
source("imin.R",encoding="utf-8")
mind <- function(d){
n <- nrow(d) #获取矩阵的行数
dd <- cbind(d,1:n) #在d的右边加上1:n索引
wmins <- apply(dd[-n,],1,imin) #删除最后一行的元素,每一行都得到K和X[K],最后生成2*4的矩阵
i <- which.min(wmins[2,])
j <- wmins[1,i]
return (c(d[i,j],i,j))
}
#运行:
setwd("D:/Rfiles/project1") #这个是将R语言的指针弄到函数文件的前一个文件包中,在这里是指到桌面
source("mind.R",encoding="utf-8")
x <- round(matrix(runif(100,0,100),10,10))
x <- x+t(x)
x <- ifelse(row(x) == col(x),0,x)
mind(x)
3.5 矩阵的函数
length获得矩阵中的数字个数
attributes(l)返回矩阵的组件
dim返回矩阵的行和列
nrow和ncol返回行数和列数
3.6 避免意外降维
当提取矩阵的某一行是,会变成向量而不是矩阵 因此导致了意外降维
避免意外降维的方法:
1、drop参数
r <- z[2,,drop = F]#注意两个逗号
2、as.matrix()进行强制转换
3.7 矩阵的行和列的命名问题
向量是给每一个元素命名,矩阵是给某一行或者某一列命名
z <- matrix(1:4,2)
colnames(z)
colnames(z) <-c("a","b")
z[,"a"]
#结果:[1] 1 2
3.8 高维数组
了解一下;
生成3*3*2的矩阵
firsttest<- matrix(c(46,21,50,30,25,50),nrow = 3)
secondtest <- matrix(c(46,41,50,43,35,50),nrow = 3)
tests <- array(data = c(firsttest,secondtest),dim = c(3,3,2))
tests
结果: