是否有R基础包内置函数可将向量填充至矩阵非对角线元素?
用R基础包高效填充方阵非对角线元素
你完全可以利用R的向量化操作简化代码,避免循环同时保持逻辑清晰。下面是基于基础包的优化实现:
vec_to_mat <- function(vec, L) { # 初始化全0方阵 mat <- matrix(0, nrow = L, ncol = L) # 获取所有非对角线元素的线性索引 non_diag_pos <- which(row(mat) != col(mat)) # 一次性填充非对角线元素 mat[non_diag_pos] <- vec mat }
验证效果,和你原函数的输出完全一致:
> vec_to_mat(seq(1:12), 4) # [,1] [,2] [,3] [,4] # [1,] 0 4 7 10 # [2,] 1 0 8 11 # [3,] 2 5 0 12 # [4,] 3 6 9 0
实现逻辑说明
- 直接初始化全0方阵,省去先设NA再替换对角线的步骤;
row(mat)和col(mat)生成与原矩阵同维度的行号、列号矩阵,通过row(mat) != col(mat)筛选出所有非对角线位置;which()将逻辑矩阵转换为线性索引,该索引顺序与矩阵按列存储的顺序完全匹配,保证填充顺序和原函数一致;- 利用R的向量化赋值一次性完成填充,比循环更高效,尤其当方阵维度
L较大时,性能提升更明显。
内容的提问来源于stack exchange,提问作者kacorn
相关产品推荐
相关产品推荐

