矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix创建矩阵。一般使用格式为:
代码语言:javascript复制matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
其中data包含了矩阵的元素,nrow和ncol用以指定行和列的维数,dimnames包含了可选的、以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充。
1
创建矩阵
#创建1:16的矩阵,行为4行,先按行排列
代码语言:javascript复制mat = matrix(1:16,nrow = 4,ncol = 4,byrow = TRUE)
2
查看矩阵维数并更改列名
代码语言:javascript复制> dim(mat)#查看维度[1] 4 4> length(mat)# 查看元素总个数[1] 16> colnames(mat) = c('a','b','c','d') #更改列名> rownames(mat) = c('e','f','g','h') #更改行名
代码语言:javascript复制> dim.name = dimnames(mat)> dim.name[[1]][1] "e" "f" "g" "h"[[2]][1] "a" "b" "c" "d"> dim.name[[1]][1] "e" "f" "g" "h"
3
矩阵的取值
代码语言:javascript复制> mat[1,3] #取第一行,第三列元素[1] 3> mat[2,] #取第二行,所有列a b c d 5 6 7 8 > mat[,3:4]#取第三列到第四列,所有行 c de 3 4f 7 8g 11 12h 15 16> mat[c(1,3),c(2,4)] #当取不相邻矩阵的行和列可以用c()创建向量 b de 2 4g 10 12> mat[-1,-2] #除去第一行 和第二列不取,其他全取 a c df 5 7 8g 9 11 12h 13 15 16> mat['f','a'] #也可以使用行名和列名来取[1] 5
4
矩阵的运算-元素间运算
对矩阵的每个元素进行加减乘除,且顺序是按照列来算的。
代码语言:javascript复制> mat #原始矩阵 a b c de 1 2 3 4f 5 6 7 8g 9 10 11 12h 13 14 15 16> mat*3 #每个元素乘以3 a b c de 3 6 9 12f 15 18 21 24g 27 30 33 36h 39 42 45 48> mat*c(1:4) #每一列均乘以1,2,3,4 a b c de 1 2 3 4f 10 12 14 16g 27 30 33 36h 52 56 60 64> mat #对矩阵运算不会改变原矩阵 a b c de 1 2 3 4f 5 6 7 8g 9 10 11 12h 13 14 15 16> mat1 = mat*c(1:4) #如果需要保留矩阵运算之后的矩阵,需要额外命名> mat1 a b c de 1 2 3 4f 10 12 14 16g 27 30 33 36h 52 56 60 64> mat*c(1:16) #按列进行对应元素相乘 a b c de 1 10 27 52f 10 36 70 112g 27 70 121 180h 52 112 180 256> mat 5 a b c de 6 7 8 9f 10 11 12 13g 14 15 16 17h 18 19 20 21> mat/3 a b c de 0.3333333 0.6666667 1.000000 1.333333f 1.6666667 2.0000000 2.333333 2.666667g 3.0000000 3.3333333 3.666667 4.000000h 4.3333333 4.6666667 5.000000 5.333333> mat/c(1:3) #如果维度不对应,会有警告 a b c de 1.0 1 1.0 4f 2.5 2 7.0 4g 3.0 10 5.5 4h 13.0 7 5.0 16Warning message:In mat/c(1:3) : longer object length is not a multiple of shorter object length
5
矩阵运算-矩阵间运算
代码语言:javascript复制> t(mat) #求矩阵转置 e f g ha 1 5 9 13b 2 6 10 14c 3 7 11 15d 4 8 12 16> mat%*%mat #矩阵与矩阵相乘 a b c de 90 100 110 120f 202 228 254 280g 314 356 398 440h 426 484 542 600> mat%*%c(1:4) [,1]e 30f 70g 110h 150> det(mat) #求矩阵的行列式[1] 4.733165e-30> diag(mat) #求矩阵的对角线元素[1] 1 6 11 16> mat2 = matrix(rnorm(16),nrow = 4) #rnorm表示在R中生成标准正态分布(normolisation)的随机数> mat3 = solve(mat2) #求逆> mat2%*%mat3
代码语言:javascript复制> rowMeans(mat) #对行求均值 e f g h 2.5 6.5 10.5 14.5 > colMeans(mat)#对列求均值 a b c d 7 8 9 10 > rowSums(mat) #对行求和 e f g h 10 26 42 58 > colSums(mat)#对列求和 a b c d 28 32 36 40