Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用不同的零块沿对角线重复矩阵乘法_R - Fatal编程技术网

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