Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Julia中创建上三角矩阵的子矩阵_Julia - Fatal编程技术网

在Julia中创建上三角矩阵的子矩阵

在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

给定列和行的列表,我想生成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           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