高效创建三对角矩阵

时间:2015-03-10 21:34:30

标签: r matrix

如何创建一个二次带矩阵,我给对角线和对角线下方和上方的第一个对角线?我正在寻找像

这样的功能
tridiag(upper, lower, main)

其中length(upper)==length(lower)==length(main)-1并返回,例如

tridiag(1:3, 2:4, 3:6)

         [,1] [,2] [,3] [,4]
[1,]    3    1    0    0
[2,]    2    4    2    0
[3,]    0    3    5    3
[4,]    0    0    4    6

有没有一种有效的方法呢?

1 个答案:

答案 0 :(得分:8)

此功能可以满足您的需求:

tridiag <- function(upper, lower, main){
    out <- matrix(0,length(main),length(main))
    diag(out) <- main
    indx <- seq.int(length(upper))
    out[cbind(indx+1,indx)] <- lower
    out[cbind(indx,indx+1)] <- upper
    return(out)
}

请注意,当矩阵的索引是2列矩阵时,该索引中的每一行都被解释为所分配的向量中单个值的行和列索引。