R 用不同的零块沿对角线重复矩阵乘法
这是一个与所问问题类似的问题。所以我有一个大矩阵,它包含由一个字符串定义的几个组,我想用一个向量乘以每个组。其思想是将一组中的每个元素替换为零,其他元素保持不变,然后与向量相乘,并与下一组重复。理想情况下,结果将存储在矩阵中 代码应能适用于较大的矩阵(具有较大的组),理想情况下,如果R 用不同的零块沿对角线重复矩阵乘法,r,R,这是一个与所问问题类似的问题。所以我有一个大矩阵,它包含由一个字符串定义的几个组,我想用一个向量乘以每个组。其思想是将一组中的每个元素替换为零,其他元素保持不变,然后与向量相乘,并与下一组重复。理想情况下,结果将存储在矩阵中 代码应能适用于较大的矩阵(具有较大的组),理想情况下,如果a%*%b或b%*%a,代码也应适用 例如,我们有矩阵a a <- matrix(c(1:81) , nrow = 9 , byrow = TRUE) 让我们命名行和列: names <- paste(
a%*%b
或b%*%a
,代码也应适用
例如,我们有矩阵a
a <- matrix(c(1:81) , nrow = 9 , byrow = TRUE)
让我们命名行和列:
names <- paste(rep(c("aaa" , "bbb" , "ccc") , each = 3) , rep(c(1:3) , times = 3) , sep = "")
rownames(a) <- names
colnames(a) <- names
我想将aaa的所有元素设置为零,并将其乘以b
,然后用bbb和ccc重复。所以第一个矩阵看起来像:
aaa1 aaa2 aaa3 bbb1 bbb2 bbb3 ccc1 ccc2 ccc3
aaa1 0 0 0 4 5 6 7 8 9
aaa2 0 0 0 13 14 15 16 17 18
aaa3 0 0 0 22 23 24 25 26 27
bbb1 28 29 30 31 32 33 34 35 36
bbb2 37 38 39 40 41 42 43 44 45
bbb3 46 47 48 49 50 51 52 53 54
ccc1 55 56 57 58 59 60 61 62 63
ccc2 64 65 66 67 68 69 70 71 72
ccc3 73 74 75 76 77 78 79 80 81
第二和第三:
aaa1 aaa2 aaa3 bbb1 bbb2 bbb3 ccc1 ccc2 ccc3
aaa1 1 2 3 4 5 6 7 8 9
aaa2 10 11 12 13 14 15 16 17 18
aaa3 19 20 21 22 23 24 25 26 27
bbb1 28 29 30 0 0 0 34 35 36
bbb2 37 38 39 0 0 0 43 44 45
bbb3 46 47 48 0 0 0 52 53 54
ccc1 55 56 57 58 59 60 61 62 63
ccc2 64 65 66 67 68 69 70 71 72
ccc3 73 74 75 76 77 78 79 80 81
aaa1 aaa2 aaa3 bbb1 bbb2 bbb3 ccc1 ccc2 ccc3
aaa1 1 2 3 4 5 6 7 8 9
aaa2 10 11 12 13 14 15 16 17 18
aaa3 19 20 21 22 23 24 25 26 27
bbb1 28 29 30 31 32 33 34 35 36
bbb2 37 38 39 40 41 42 43 44 45
bbb3 46 47 48 49 50 51 52 53 54
ccc1 55 56 57 58 59 60 0 0 0
ccc2 64 65 66 67 68 69 0 0 0
ccc3 73 74 75 76 77 78 0 0 0
将这三个矩阵相乘得到三个向量,它们被cbind
合并成一个矩阵:
[,1] [,2] [,3]
aaa1 427 465 465
aaa2 994 1194 1194
aaa3 1561 1923 1923
bbb1 2652 1786 2652
bbb2 3381 2272 3381
bbb3 4110 2758 4110
ccc1 4839 4839 2605
ccc2 5568 5568 3010
ccc3 6297 6297 3415
您可以使用
sapply
覆盖c(“aaa”、“bbb”、“ccc”)
并使用grep查找选定的列和行,如:
b <- c(5:13)
sapply(c("aaa" , "bbb" , "ccc"), function(tt) {
a[grep(tt, rownames(a)), grep(tt, colnames(a))] <- 0
b %*% t(a) #or a %*% b
})
# aaa bbb ccc
# [1,] 427 465 465
# [2,] 994 1194 1194
# [3,] 1561 1923 1923
# [4,] 2652 1786 2652
# [5,] 3381 2272 3381
# [6,] 4110 2758 4110
# [7,] 4839 4839 2605
# [8,] 5568 5568 3010
# [9,] 6297 6297 3415
b
[,1] [,2] [,3]
aaa1 427 465 465
aaa2 994 1194 1194
aaa3 1561 1923 1923
bbb1 2652 1786 2652
bbb2 3381 2272 3381
bbb3 4110 2758 4110
ccc1 4839 4839 2605
ccc2 5568 5568 3010
ccc3 6297 6297 3415
b <- c(5:13)
sapply(c("aaa" , "bbb" , "ccc"), function(tt) {
a[grep(tt, rownames(a)), grep(tt, colnames(a))] <- 0
b %*% t(a) #or a %*% b
})
# aaa bbb ccc
# [1,] 427 465 465
# [2,] 994 1194 1194
# [3,] 1561 1923 1923
# [4,] 2652 1786 2652
# [5,] 3381 2272 3381
# [6,] 4110 2758 4110
# [7,] 4839 4839 2605
# [8,] 5568 5568 3010
# [9,] 6297 6297 3415