我有一个(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=8000
和M=20
的设置中工作得相当好?只要结果可以反向转换为Matrix
类,它就不一定需要在Matrix
包设置内.