我有一个(K*M) x (K*M)维的稀疏二次对角线矩阵H.目标是用大小为K x K的已知二次矩阵A替换矩阵的下非对角线blocks:

# dimensions of the final matrix are (K*M) x (K*M)
K        = 5
M        = 3

# initiate the matrix as diagonal
H        = Matrix::Diagonal(K*M)

# convert because off-diagonal replacement does not work for sparse diagonal class
H        = as(H, "dgCMatrix")

# matrix that will replace the lower off-diagonal blocks of size K x K
A        = matrix(runif(K^2), K, K)

以下方法使用辅助向量来索引大小合适的非对角线块,并循环遍历每个块:

# construct vector that is used to index the lower off-diagonal blocks of size K x K
indices   = seq(1, K * (1 + M), K)

# replace all M - 1 lower off-diagonal blocks
for(ii in 1:(M-1)){
  
  H[indices[ii + 1]:(indices[ii + 2]-1), indices[ii]:(indices[ii + 1]-1)] = A

}

不幸的是,当矩阵的维度增长时,索引和替换这些块变得极其缓慢.有没有更快的方法可以在K=8000M=20的设置中工作得相当好?只要结果可以反向转换为Matrix类,它就不一定需要在Matrix包设置内.

推荐答案

稀疏带状矩阵和稠密块的Kronecker乘积应该是"快"的,但您会想要做自己的基准测试……

library(Matrix)
set.seed(0)
K <- 5L
M <- 3L

(X <- bandSparse(M, M, -1L, list(rep.int(1, M - 1L))))
## 3 x 3 sparse Matrix of class "dtCMatrix"
##           
## [1,] . . .
## [2,] 1 . .
## [3,] . 1 .

(Y <- matrix(round(runif(K * K), 2L), K, K))
##      [,1] [,2] [,3] [,4] [,5]
## [1,] 0.90 0.20 0.06 0.77 0.78
## [2,] 0.27 0.90 0.21 0.50 0.93
## [3,] 0.37 0.94 0.18 0.72 0.21
## [4,] 0.57 0.66 0.69 0.99 0.65
## [5,] 0.91 0.63 0.38 0.38 0.13

XY <- kronecker(X, Y)
diag(XY) <- 1
XY
## 15 x 15 sparse Matrix of class "dgCMatrix"
##                                                                  
##  [1,] 1.00 .    .    .    .    .    .    .    .    .    . . . . .
##  [2,] .    1.00 .    .    .    .    .    .    .    .    . . . . .
##  [3,] .    .    1.00 .    .    .    .    .    .    .    . . . . .
##  [4,] .    .    .    1.00 .    .    .    .    .    .    . . . . .
##  [5,] .    .    .    .    1.00 .    .    .    .    .    . . . . .
##  [6,] 0.90 0.20 0.06 0.77 0.78 1.00 .    .    .    .    . . . . .
##  [7,] 0.27 0.90 0.21 0.50 0.93 .    1.00 .    .    .    . . . . .
##  [8,] 0.37 0.94 0.18 0.72 0.21 .    .    1.00 .    .    . . . . .
##  [9,] 0.57 0.66 0.69 0.99 0.65 .    .    .    1.00 .    . . . . .
## [10,] 0.91 0.63 0.38 0.38 0.13 .    .    .    .    1.00 . . . . .
## [11,] .    .    .    .    .    0.90 0.20 0.06 0.77 0.78 1 . . . .
## [12,] .    .    .    .    .    0.27 0.90 0.21 0.50 0.93 . 1 . . .
## [13,] .    .    .    .    .    0.37 0.94 0.18 0.72 0.21 . . 1 . .
## [14,] .    .    .    .    .    0.57 0.66 0.69 0.99 0.65 . . . 1 .
## [15,] .    .    .    .    .    0.91 0.63 0.38 0.38 0.13 . . . . 1

R相关问答推荐

R的法国工作日

仅在ggplot的每个方面绘制最丰富的物种

图片中令人惊讶的行为

分组时间连续值

列出用m n个值替换来绘制n个数字的所有方法(i.o.w.:R中大小为n的集合的所有划分为m个不同子集)

pickerInput用于显示一条或多条geom_hline,这些线在图中具有不同 colored颜色

通过使用str_detect对具有相似字符串的组进行分组

当两个图层映射到相同的美学时,隐藏一个图层的图例值

为什么观察不会被无功值变化触发?

在特定Quarto(reveal.js)幻灯片上隐藏徽标

在某些栏和某些条件下,替换dfs列表中的NA

是否可以创建一个ggplot与整洁判断的交互作用

为什么我的基准测试会随着样本量的增加而出现一些波动?

R-按最接近午夜的时间进行筛选

R -在先前group_by级别汇总时获取最大大小子组的计数

在R中的数据框上使用Apply()函数时,如何保留非数字列?

用满足特定列匹配的另一行替换NA行

如何在GALT包的函数&geom_x样条线中调整线宽

如何从嵌套数据中自动创建命名对象?在R中

为什么不能使用lApply在包装函数中调用子集