Julia中如何从对角矩阵提取对角元素生成一维数组
Julia中提取Diagonal类型矩阵对角元素为一维数组的方法
Diagonal是Julia标准库LinearAlgebra提供的特殊对角矩阵类型,使用前需要先导入该库。针对A = Diagonal(rand(3,3))的场景,有两种成熟的实现方案:
- 零拷贝高性能方案:直接读取内部存储字段
Diagonal类型为了节省内存、提升运算效率,本身就会把所有对角元素以一维数组的形式存在diag字段中,非对角元素不会实际存储。直接读取该字段就能拿到目标一维数组,全程没有额外的数据拷贝,性能最优:
注意:这个方式拿到的数组和原矩阵内部存储是同一块内存,修改using LinearAlgebra A = Diagonal(rand(3,3)) diagonal_array = A.diagdiagonal_array的元素会同步修改原矩阵A的对应对角值。 - 通用兼容方案:调用标准库对角线接口
如果你的代码后续可能替换矩阵类型(比如换成普通稠密矩阵、三角矩阵、其他结构化矩阵),可以用LinearAlgebra提供的通用diag()函数,不需要关心输入矩阵的具体存储结构,就能稳定返回主对角线的一维数组,代码鲁棒性更好:using LinearAlgebra A = Diagonal(rand(3,3)) diagonal_array = diag(A)
避坑提示:不要写循环逐个取
A[i,i]再拼数组的冗余代码,这种写法不仅代码量大,性能也远低于上述两种原生实现。
内容的提问来源于stack exchange,提问作者James Rider
相关产品推荐
相关产品推荐

