R语言基于指定数值向量高效生成特殊对角矩阵的方案咨询
高效实现方案
首先避免使用c作为变量名,这是R的内置拼接函数,容易引发命名冲突,我们将其重命名为vec。
方案1:基于托普利茨矩阵实现(最高效,推荐)
托普利茨矩阵生成和下三角赋值都是R底层C实现,完全避免R层循环开销,适合超大规模数据集:
# 定义原始向量 vec <- c(5, 4.5, 4, 3.5, 3, 2.5, 2, 1.5, 1, 0.5, 0, 0) n <- length(vec) # 生成托普利茨矩阵 mat <- toeplitz(vec) # 将下三角(不含对角线)元素置为0 mat[lower.tri(mat)] <- 0
运行后得到的mat就是你需要的矩阵格式,如果需要转成data.table,直接调用as.data.table(mat)即可。
方案2:纯向量化索引赋值(无依赖)
如果不想依赖stats包的toeplitz函数,可以用矩阵索引向量化操作实现,效率同样远高于纯R循环:
vec <- c(5, 4.5, 4, 3.5, 3, 2.5, 2, 1.5, 1, 0.5, 0, 0) n <- length(vec) # 初始化全0矩阵 mat <- matrix(0, nrow = n, ncol = n) # 获取所有列索引大于等于行索引的位置 fill_pos <- which(col(mat) >= row(mat), arr.ind = TRUE) # 按位置对应关系赋值 mat[fill_pos] <- vec[fill_pos[, "col"] - fill_pos[, "row"] + 1]
效率说明
以上两种方案都没有R层的显式循环,所有计算都调用底层编译代码,对于10000×10000级别的矩阵也能在秒级完成运算,相比手写R循环效率提升至少上百倍。
内容的提问来源于stack exchange,提问作者lil_barnacle
相关产品推荐
相关产品推荐

