块对角线 - 将每个块乘以另一个向量的一个元素

时间:2015-11-12 01:37:50

标签: r matrix

支持我有以下块对角矩阵:

a <- matrix(1:6, 2, 3)
b <- matrix(7:10, 2, 2)
library(magic)
Block <- adiag(a,b)

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    3    5    0    0
#[2,]    2    4    6    0    0
#[3,]    0    0    0    7    9
#[4,]    0    0    0    8   10

我需要将每个块乘以下一个向量的一部分。这意味着第一个块&#34; a&#34;时间2和块&#34; b&#34;次1。

v1=c(2,1)

所以最后我有:

#     [,1] [,2]  [,3]  [,4] [,5]
#[1,]    2    6    10    0    0
#[2,]    4    8    12    0    0
#[3,]    0    0    0     7    9
#[4,]    0    0    0     8   10

我怎么能以最有效的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

直到有更好的解决方案或改进这个。

a <- matrix(1:9, 3, 3)
b <- matrix(7:10, 2, 2)
c <- matrix(9:24, 4, 4)

library(magic)
Block <- adiag(a,b,c)
Block
#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#  [1,]    1    4    7    0    0    0    0    0    0
#  [2,]    2    5    8    0    0    0    0    0    0
#  [3,]    3    6    9    0    0    0    0    0    0
#  [4,]    0    0    0    7    9    0    0    0    0
#  [5,]    0    0    0    8   10    0    0    0    0
#  [6,]    0    0    0    0    0    9   13   17   21
#  [7,]    0    0    0    0    0   10   14   18   22
#  [8,]    0    0    0    0    0   11   15   19   23
#  [9,]    0    0    0    0    0   12   16   20   24

v1 <- c(2,1,4)
apply(Block, 2, "*", rep(v1, c(NROW(a),NROW(b),NROW(c))))
#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#  [1,]    2    8   14    0    0    0    0    0    0
#  [2,]    4   10   16    0    0    0    0    0    0
#  [3,]    6   12   18    0    0    0    0    0    0
#  [4,]    0    0    0    7    9    0    0    0    0
#  [5,]    0    0    0    8   10    0    0    0    0
#  [6,]    0    0    0    0    0   36   52   68   84
#  [7,]    0    0    0    0    0   40   56   72   88
#  [8,]    0    0    0    0    0   44   60   76   92
#  [9,]    0    0    0    0    0   48   64   80   96

或者根据Ven Yao的评论建议:

adiag(a*v1[1], b*v1[2], c*v1[3])

答案 1 :(得分:2)

另一个选项是来自bdiag的{​​{1}}(使用@Pascal的示例)。我们将单个向量(即“a”,“b”,“c”)放在library(Matrix)中(使用list),使用mget与“v1”的相应元素相乘并包装Map

bdiag