矩阵的基本操作
#将c(1,4)和c(1,2)两个向量绑定起来 > m<-rbind(c(1,4),c(2,2)) > m [,1] [,2] [1,] 1 4 [2,] 2 2 #计算向量(1,1)和m的矩阵积 > m%*%c(1,1) [,1] [1,] 5 [2,] 4 #第一行第二列 > m[1,2] [1] 4 #第二行第二列 > m[2,2] [1] 2 #第一行 > m[1,] [1] 1 4 #第二列 > m[,2] [1] 4 2 >
(1)创建矩阵
法一 > y<-matrix(c(1,2,3,4),nrow=2,ncol=2) > y [,1] [,2] [1,] 1 3 [2,] 2 4 #可以只定义nrow和ncol中的一个 > y<-matrix(c(1,2,3,4),nrow=2) > y [,1] [,2] [1,] 1 3 [2,] 2 4 #表示创建矩阵第二列 > y[,2] [1] 3 4 法二 #byrow参数设置为TRUE,使矩阵元素按行排列 > m<-matrix(c(1,2,3,4,5,6),nrow=2,byrow=T) > m [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 y<-matrix(nrow=2,ncol = 2) > y[1,1]<-1 > y[2,1]<-2 > y[1,2]<-3 > y[2,2]<-4 > y [,1] [,2] [1,] 1 3 [2,] 2 4
(2) 线性代数运算
#矩阵相乘 > y%*%y [,1] [,2] [1,] 7 15 [2,] 10 22 #矩阵数量乘法 > 3*y [,1] [,2] [1,] 3 9 [2,] 6 12 #矩阵加法 > y+y [,1] [,2] [1,] 2 6 [2,] 4 8
(3)矩阵索引
•使用逗号,分隔行和列索引来访问矩阵中的元素 # 创建一个3x3的矩阵 mat <- matrix(1:9, nrow = 3) mat # 访问特定元素 mat[2, 3] # 访问第2行第3列的元素,输出为6 #也可以使用 > "["(z,3,2) [1] 7 #"["相当于一个函数 # 访问整行或整列 mat[1, ] # 访问第1行的所有元素,输出为 1 4 7 mat[, 2] # 访问第2列的所有元素,输出为 2 5 8 # 访问多行或多列 mat[2:3, ] # 访问第2行和第3行的所有元素 mat[, c(1, 3)] # 访问第1列和第3列的所有元素 •使用逻辑向量来选择满足特定条件的行或列 # 创建一个3x3的矩阵 mat <- matrix(1:9, nrow = 3) mat # 使用逻辑向量进行索引 mat[mat > 5] # 选择大于5的元素,输出为 6 7 8 9 mat[mat[, 2] > 3, ] # 选择第2列大于3的行的所有元素 •对一个矩阵的子矩阵进行赋值 > y<-matrix(c(1:6),nrow=3) > y [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 #第一行和第三行赋值 > y[c(1,3),]<-matrix(c(1,1,8,12),nrow=2) > y [,1] [,2] [1,] 1 8 [2,] 2 5 [3,] 1 12 > x<-matrix(nrow=3,ncol=3) > y<-matrix(c(4,5,2,3),nrow=2) > y [,1] [,2] [1,] 4 2 [2,] 5 3 > x[2:3,2:3]<-y > x [,1] [,2] [,3] [1,] NA NA NA [2,] NA 4 2 [3,] NA 5 3
(4)矩阵元素的筛选
> x<-matrix(c(1,2,3,2,3,4),nrow=3) > x [,1] [,2] [1,] 1 2 [2,] 2 3 [3,] 3 4 #判断第二列元素是否>=3,若>=3,则输出 > x[x[,2]>=3,] [,1] [,2] [1,] 2 3 [2,] 3 4 逐步分解为 > j<-x[,2]>=3 > j [1] FALSE TRUE TRUE #x[j,]的行与向量j中的取值为TRUE的行对应 > x[j,] [,1] [,2] [1,] 2 3 [2,] 3 4 > x<-matrix(c(1:6),nrow=3) > x [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 > z<-c(5,12,13) #z%%2==1用于判断z的每个元素是否是奇数,返回的结果是(TRUE,FALSE,TRUE) #因此我们提取第1,3行的数据 > x[z%%2==1,] [,1] [,2] [1,] 1 4 [2,] 3 6 注意:如果写为以下形式,就不是以矩阵形式显示了 >x[z%%2==1] [1] 1 3 4 6 > x [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 #这里用了&,表示两个条件都需要判断 > x[x[,1]>1 & x[,2]>5,] [1] 3 6 #which(m>2)来查找矩阵m中大于2的元素的索引 > m<-matrix(c(5,2,9,-1,10,11),nrow=3) > m [,1] [,2] [1,] 5 -1 [2,] 2 10 [3,] 9 11 > which(m>2) [1] 1 3 5 6
#m的1,3,5,6个元素大于2
(5)增加或删除矩阵的行或列
> x<-c(12,5,13,16,8) > x [1] 12 5 13 16 8 > x<-c(x,20) > x [1] 12 5 13 16 8 20 > x<-c(x[1:3],20,x[4:6]) > x [1] 12 5 13 20 16 8 20 > x<-x[-2:-4] > x [1] 12 16 8 20 > one<-c(1,1,1,1) > z<-matrix(c(1,2,3,4,1,1,0,0,1,0,1,0),nrow=4) > z [,1] [,2] [,3] [1,] 1 1 1 [2,] 2 1 0 [3,] 3 0 1 [4,] 4 0 0 > cbind(one,z) one [1,] 1 1 1 1 [2,] 1 2 1 0 [3,] 1 3 0 1 [4,] 1 4 0 0 #1被循环补齐为由4个1组成的列向量 > cbind(1,z) [,1] [,2] [,3] [,4] [1,] 1 1 1 1 [2,] 1 2 1 0 [3,] 1 3 0 1 [4,] 1 4 0 0 #和创建向量一样,创建一个新的矩阵很消耗时间 > q<-cbind(c(1,2),c(3,4)) > q [,1] [,2] [1,] 1 3 [2,] 2 4 #可以通过重新赋值来删除矩阵的行或列 > m<-matrix(1:6,nrow=3) > m [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 > m<-m[c(1,3),] > m [,1] [,2] [1,] 1 4 [2,] 3 6
(6)apply()函数
apply()函数的格式 apply(m,dimcode,f,farge) m代表一个矩阵 dimcode表示维度代码,1表示每一行应用函数,2表示每一列应用函数 f是应用在行,列上的函数 farge是f的可选参数集 > z<-matrix(c(1:6),nrow = 3) > z [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 > apply(z,2,mean) #或者可以直接使用colMeans > colMeans(z) [1] 2 5 这里的f可以是自定义函数 > f<-function(x){ + return(x/c(2,8)) + } > y<-apply(z,1,f) > y [,1] [,2] [,3] [1,] 0.5 1.000 1.50 [2,] 0.5 0.625 0.75 fargs表示可选参数集 > copymag<-function(rw,d){ #向量每个元素对应矩阵的每行,如果该行前d个元素中1较多,向量对应元素就取1,反之取0 + maj<-sum(rw[1:d])/d + return(if(maj>0.5)1 else 0) + } > x<-matrix(c(1,1,1,0,0,1,0,1,1,1,0,1,1,1,1,1,0,0,1,0),nrow = 4) > x [,1] [,2] [,3] [,4] [,5] [1,] 1 0 1 1 0 [2,] 1 1 1 1 0 [3,] 1 0 0 1 1 [4,] 0 1 1 1 0 > apply(x,1,copymag,3) [1] 1 1 0 1 > apply(x,1,copymag,2) [1] 0 1 0 0 #这里的3,2是函数copymaj()中形式参数d的实际取值,矩阵的第一行是(1,0,1,1,0),当d取3时,前3个是(1,0,1),1占多数,则copymag返回1,第一个元素为1,其他以此类推 > apply(x,2,copymag,2) [1] 1 0 1 1 0
(7)矩阵和向量的区别
> z<-matrix(c(1:8),nrow = 4) > z [,1] [,2] [1,] 1 5 [2,] 2 6 [3,] 3 7 [4,] 4 8 #z作为1个向量,可以求他的长度 > length(z) [1] 8 #z也是一个矩阵,有矩阵的性质 > dim(z) [1] 4 2 > nrow(z) [1] 4 > ncol(z) [1] 2 #得到矩阵的行数和列数,[1]显示行数,[2]显示列数 > nrow<-function(x) + dim(x)[1] > nrow(z) [1] 4
>
(8)避免意外降维
> z [,1] [,2] [1,] 1 5 [2,] 2 6 [3,] 3 7 [4,] 4 8 > r<-z[2,] > r [1] 2 6 #这里的r是一个长度为2的向量,而不是一个1*2的矩阵,所以出现了降维,如何避免降维呢 可以用以下方法验证 > attributes(z) $dim [1] 4 2 > attributes(r) NULL > str(z) int [1:4, 1:2] 1 2 3 4 5 6 7 8 > str(r) int [1:2] 2 6 可以用drop()参数 > r<-z[2,,drop=FALSE] #r是一个1*2的矩阵 > r [,1] [,2] [1,] 2 6 > dim(r) [1] 1 2
(9)矩阵行和列的命名
> z<-matrix(c(1:4),nrow = 2) > z [,1] [,2] [1,] 1 3 [2,] 2 4 > colnames(z) NULL > colnames(z)<-c("a","b") > z a b [1,] 1 3 [2,] 2 4 > colnames(z) [1] "a" "b" > z[,"a"] [1] 1 2
(10)高维数组
> firsttest<-matrix(c(46,21,50,30,25,48),nrow=3) > secondtest<-matrix(c(46,41,50,43,35,49),nrow=3) > test<-array(data=c(firsttest,secondtest),dim=c(3,2,2))#共有2层,每层分别是3行2列 > attributes(test) $dim [1] 3 2 2 #学生3第一次考试,第二部分的得分 > test[3,2,1] [1] 48 #逐层显示 > print(test) , , 1 [,1] [,2] [1,] 46 30 [2,] 21 25 [3,] 50 50 , , 2 [,1] [,2] [1,] 46 43 [2,] 41 35 [3,] 50 50