Этот вопрос похож на вопрос здесь . Итак, у меня есть одна большая матрица, содержащая несколько групп, определенных строкой, и я хочу умножить каждую группу на вектор. Идея состоит в том, чтобы заменить каждый элемент одной группы на ноль, оставив все остальное как есть, затем умножить на вектор и повторить со следующей группой. В идеале результаты должны храниться в матрице.
Код должен быть в состоянии работать для больших матриц (с большими группами) и в идеале также должен работать, если 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