在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1、生成矩阵,使用matrix函数 > set.seed(111) ## 设定随机数种子 > vect <- sample(1:10,16, replace = T) > vect [1] 4 3 9 5 3 8 10 1 10 4 8 10 9 8 1 7 > dat <- matrix(vect, nrow = 4, ncol = 4, byrow = T, ## 生成4行4列矩阵,矩阵行列相同,也叫方阵,并指定行名、列名 + dimnames = list(paste0("r",1:4), paste0("c",1:4))) > dat c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > class(dat) [1] "matrix" "array"
2、提取主对角线元素 > dat c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > class(dat) [1] "matrix" "array" > diag(dat) ## 提取主对角线元素 [1] 4 8 8 7
3、提取副对角线元素 > dat c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > diag(dat[,ncol(dat):1]) ## 先列逆向输出,然后取对角线 [1] 5 10 4 9
4、生成对角线为1的对角矩阵(对角矩阵条件:1、矩阵行、列相等,即方阵 2、除对角线元素外其余元素全部为0) > test1 <- diag(4) ## 生成对角线元素为1的4行4列对角元素 > test1 [,1] [,2] [,3] [,4] [1,] 1 0 0 0 [2,] 0 1 0 0 [3,] 0 0 1 0 [4,] 0 0 0 1 > class(test1) [1] "matrix" "array" > dim(test1) [1] 4 4
5、提取矩阵的下三角矩阵、上三角矩阵 > dat c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > dat[lower.tri(dat)] ## 提取下三角矩阵 [1] 3 10 9 4 8 1 > dat[upper.tri(dat)] ## 提取上三角矩阵 [1] 3 9 10 5 1 10
6、矩阵转置(即行列互换) > dat c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > t(dat) ## 矩阵转置 r1 r2 r3 r4 c1 4 3 10 9 c2 3 8 4 8 c3 9 10 8 1 c4 5 1 10 7
7、以矩阵下三角矩阵构建对称矩阵(对称矩阵:指以主对角线为对称轴,各元素对应相等的矩阵。) > test <- dat > test c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > test[upper.tri(test)] <- t(test)[upper.tri(test)] ## 将test上对角矩阵 赋值为test转置后的上对角矩阵 > test c1 c2 c3 c4 r1 4 3 10 9 r2 3 8 4 8 r3 10 4 8 1 r4 9 8 1 7
8、以矩阵的上对角矩阵构建对称矩阵 > test <- dat > test c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > test[lower.tri(test)] <- t(test)[lower.tri(test)] ## 同上 > test c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 9 10 8 10 r4 5 1 10 7
9、将矩阵转换成行索引、列索引、值的形式 (1)列优先 > test <- dat > test c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > r <- rep(1:nrow(test), times = ncol(test)) ## 生成行的索引,优先按列输出 > r [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 > c <- rep(1:ncol(test), each = nrow(test)) ## 生成列的索引,优先按列输出 > c [1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 > values <- test[1:(nrow(test)*ncol(test))] ## 输出矩阵的每一个值,优先按列输出 > values [1] 4 3 10 9 3 8 4 8 9 10 8 1 5 1 10 7 > result <- data.frame(r, c, values) > result ## 结果文件 r c values 1 1 1 4 2 2 1 3 3 3 1 10 4 4 1 9 5 1 2 3 6 2 2 8 7 3 2 4 8 4 2 8 9 1 3 9 10 2 3 10 11 3 3 8 12 4 3 1 13 1 4 5 14 2 4 1 15 3 4 10 16 4 4 7
(2)、行优先 > test <- dat > test c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > r <- rep(1:nrow(test), each = ncol(test)) ## 生成行索引,行优先 > r [1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 > c <- rep(1:ncol(test), time = nrow(test)) ## 生成列索引,行优先 > c [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 > values <- vector() > for (i in 1:nrow(test)) { ## 利用双循环按行优先导出矩阵的值 + for (j in 1:ncol(test)) { + values <- c(values, test[i,j]) + } + } > values [1] 4 3 9 5 3 8 10 1 10 4 8 10 9 8 1 7 > result <- data.frame(r, c, values) > result ## 结果文件 r c values 1 1 1 4 2 1 2 3 3 1 3 9 4 1 4 5 5 2 1 3 6 2 2 8 7 2 3 10 8 2 4 1 9 3 1 10 10 3 2 4 11 3 3 8 12 3 4 10 13 4 1 9 14 4 2 8 15 4 3 1 16 4 4 7
10、将三列的矩阵(列优先)形式转换为矩阵形式 > test <- dat > test c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > r <- rep(1:nrow(test), time = ncol(test) ) > r [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 > c <- rep(1:ncol(test), each = nrow(test)) > c [1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 > values <- as.numeric(dat) > values [1] 4 3 10 9 3 8 4 8 9 10 8 1 5 1 10 7 > result <- data.frame(r, c, values) > result ## 三列的形式,列优先 r c values 1 1 1 4 2 2 1 3 3 3 1 10 4 4 1 9 5 1 2 3 6 2 2 8 7 3 2 4 8 4 2 8 9 1 3 9 10 2 3 10 11 3 3 8 12 4 3 1 13 1 4 5 14 2 4 1 15 3 4 10 16 4 4 7 > if (all(result[,2] == sort(result[,2]))) { ## 利用第二列判断是否是列优先 + row <- max(result[,1]) + col <- max(result[,1]) + re_matrix <- matrix(result[,3], nrow = row, ncol = col, byrow = F) ## byrow = F,表示按列优先输出 + } > re_matrix [,1] [,2] [,3] [,4] [1,] 4 3 9 5 [2,] 3 8 10 1 [3,] 10 4 8 10 [4,] 9 8 1 7
11、将三列的矩阵(行优先)形式转换为矩阵形式 > test <- dat > test c1 c2 c3 c4 r1 4 3 9 5 r2 3 8 10 1 r3 10 4 8 10 r4 9 8 1 7 > r <- rep(1:nrow(test), each = ncol(test)) > r [1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 > c <- rep(1:ncol(test), times = nrow(test)) > c [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 > values <- vector() > for (i in 1:nrow(test)) { + for(j in 1:ncol(test)){ + values <- c(values, test[i,j]) + } + } > values [1] 4 3 9 5 3 8 10 1 10 4 8 10 9 8 1 7 > result <- data.frame(r, c, values) > result ## 行优先的三列矩阵 r c values 1 1 1 4 2 1 2 3 3 1 3 9 4 1 4 5 5 2 1 3 6 2 2 8 7 2 3 10 8 2 4 1 9 3 1 10 10 3 2 4 11 3 3 8 12 3 4 10 13 4 1 9 14 4 2 8 15 4 3 1 16 4 4 7 > if (all(result[,2] != sort(result[,2]))) { ## 如果第二列不是排好序,则说明是行优先 + row <- mas(result[,1]) + col <- max(result[,2]) + re_matrix <- matrix(result[,3], nrow = row, ncol = col, byrow = T) ## byrow = T,表示按行优先输出 + } > re_matrix [,1] [,2] [,3] [,4] [1,] 4 3 9 5 [2,] 3 8 10 1 [3,] 10 4 8 10 [4,] 9 8 1 7
12、矩阵加法、减法运算(矩阵加减法运算前提是两个矩阵维度一致,即同行同列) > mat1 <- matrix(sample(1:10,9), nrow = 3, ncol = 3, byrow = T) ## 生成3行3列矩阵 > mat1 [,1] [,2] [,3] [1,] 4 9 10 [2,] 2 7 6 [3,] 8 1 3 > mat2 <- matrix(sample(1:10,9), nrow = 3, ncol = 3, byrow = T) ## 生成3行3列矩阵 > mat2 [,1] [,2] [,3] [1,] 7 5 9 [2,] 1 4 2 [3,] 6 8 10 > mat1 + mat2 ## 矩阵加法运算 [,1] [,2] [,3] [1,] 11 14 19 [2,] 3 11 8 [3,] 14 9 13 > mat1 - mat2 ## 矩阵减法运算 [,1] [,2] [,3] [1,] -3 4 1 [2,] 1 3 4 [3,] 2 -7 -7
13、矩阵与数值的乘法运算 > mat1 <- matrix(sample(1:10, 9), ncol = 3, nrow = 3, byrow = T) ## 生成3行3列矩阵 > mat1 [,1] [,2] [,3] [1,] 10 8 6 [2,] 4 2 1 |
请发表评论