在Julia中创建上三角矩阵的子矩阵
给定列和行的列表,我想生成cholesky分解的子矩阵。例如:在Julia中创建上三角矩阵的子矩阵,julia,Julia,给定列和行的列表,我想生成cholesky分解的子矩阵。例如: julia> A = rand(10,10) julia> R = chol(A'*A) julia> ind = [1,3,6,8,9] julia> R[ind,ind] 但是,这会导致一个错误: ERROR: BoundsError: attempt to access 5x5 UpperTriangular{Float64,Array{Float64,2}}: 1.28259 0.0
julia> A = rand(10,10)
julia> R = chol(A'*A)
julia> ind = [1,3,6,8,9]
julia> R[ind,ind]
但是,这会导致一个错误:
ERROR: BoundsError: attempt to access 5x5
UpperTriangular{Float64,Array{Float64,2}}:
1.28259 0.0 0.0 0.0 0.0
0.0 6.51646e-314 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
at index [2,1]
in _unsafe_getindex at multidimensional.jl:197
in getindex at abstractarray.jl:483
我知道这适用于典型的矩阵,但是
uppertriangal
类型显然需要一些不同的东西。。。我找不到这方面的文档。看起来三角矩阵还没有更新,以利用0.4中的回退非标量索引(这是0.3中缺少的方法错误)
目前最简单的解决方法是在索引之前转换为完整数组:
julia> full(R)[ind,ind]
5x5 Array{Float64,2}:
2.2261 1.28096 1.69087 1.26135 1.50703
0.0 1.03681 0.115735 0.559855 0.70766
0.0 0.0 0.702936 -0.111155 -0.61263
0.0 0.0 0.0 0.661491 0.33661
0.0 0.0 0.0 0.0 0.159691
或者通过使用子阵列,在原始数据中创建视图(这样修改将传播):
如果我打算使用子矩阵进行进一步的计算,我会做上三角(满(R)[ind,ind])?这似乎效率低下(实际上我有一个大矩阵
R
).triangal
类型只是围绕完整矩阵的包装。他们只是告诉Julia忽略对角线上方或下方的所有元素。重新包装结果不会复制底层数据,因此它的效率并不是那么低。很好!很高兴知道。也许我应该考虑将其存储为稀疏的上三角矩阵,然后。。。我假设较低的对角线零在默认情况下不会存储在内存中。尽管这会占用较少的内存,但我感觉在大多数情况下,它会慢得多。
julia> sub(R, ind, ind)
5x5 SubArray{Float64,2,UpperTriangular{Float64,Array{Float64,2}},Tuple{Array{Int64,1},Array{Int64,1}},0}:
2.2261 1.28096 1.69087 1.26135 1.50703
0.0 1.03681 0.115735 0.559855 0.70766
0.0 0.0 0.702936 -0.111155 -0.61263
0.0 0.0 0.0 0.661491 0.33661
0.0 0.0 0.0 0.0 0.159691