Повторение умножения матрицы с различными блоками нулей вдоль ее диагонали - PullRequest
1 голос
/ 16 октября 2019

Этот вопрос похож на вопрос здесь . Итак, у меня есть одна большая матрица, содержащая несколько групп, определенных строкой, и я хочу умножить каждую группу на вектор. Идея состоит в том, чтобы заменить каждый элемент одной группы на ноль, оставив все остальное как есть, затем умножить на вектор и повторить со следующей группой. В идеале результаты должны храниться в матрице.

Код должен быть в состоянии работать для больших матриц (с большими группами) и в идеале также должен работать, если a%*%b или b%*%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

Умножение этих трех матриц дает три вектора, которые 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

1 Ответ

1 голос
/ 16 октября 2019

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...