【问题标题】:Repeating a Matrix Multiplication with Different Blocks of zeroes along its Diagonal沿其对角线重复具有不同零块的矩阵乘法
【发布时间】:2019-10-16 09:38:00
【问题描述】:

这与here 提出的问题类似。所以我有一个包含多个由字符串定义的组的大矩阵,并且希望将每个组与一个向量相乘。这个想法是用零替换一组中的每个元素,让其他所有元素保持原样,然后与向量相乘并与下一组重复。理想情况下,结果将存储在矩阵中。

代码应该能够适用于更大的矩阵(具有更大的组),理想情况下也应该适用于a%*%bb%*%a

例如,我们有矩阵a

a <- matrix(c(1:81) , nrow = 9 , byrow = TRUE)

和矢量b

b <- c(5:14)

让我们命名行和列:

names <- paste(rep(c("aaa" , "bbb" , "ccc") , each = 3) , rep(c(1:3) , times = 3) , sep = "")
rownames(a) <- names
colnames(a) <- names

给出:

     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   61   62   63
ccc2   64   65   66   67   68   69   70   71   72
ccc3   73   74   75   76   77   78   79   80   81

我想将 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

将这三个矩阵相乘得到三个向量,它们是cbinded 成一个矩阵:

     [,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

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 2021-04-21
      • 2021-12-12
      相关资源
      最近更新 更多