【发布时间】:2017-01-21 16:20:09
【问题描述】:
我正在尝试提出一种在 Julia 中调整矩阵大小的高效方法。该矩阵仅在某些方法中用作雅可比矩阵的内部缓存,因此不需要以任何顺序保留其值(它们将立即被覆盖)。我正在考虑直接生成一个向量并使用矩阵作为该向量的重塑视图。然而,Julia 然后阻止我 resize!ing 向量:
Jvec = zeros(9)
J = reshape(Jvec,3,3))
resize!(Jvec,16)
cannot resize array with shared data
in resize!(::Array{Float64,1}, ::Int64) at ./array.jl:512
in include_string(::String, ::String) at ./loading.jl:441
in eval(::Module, ::Any) at ./boot.jl:234
in (::Atom.##67#70)() at /home/crackauc/.julia/v0.5/Atom/src/eval.jl:40
in withpath(::Atom.##67#70, ::Void) at /home/crackauc/.julia/v0.5/CodeTools/src/utils.jl:30
in withpath(::Function, ::Void) at /home/crackauc/.julia/v0.5/Atom/src/eval.jl:46
in macro expansion at /home/crackauc/.julia/v0.5/Atom/src/eval.jl:109 [inlined]
in (::Atom.##66#69)() at ./task.jl:60
也不会让我resize! 视图消失的向量(希望之后只是创建一个新视图):
J = 0
resize!(Jvec,16)
cannot resize array with shared data
in resize!(::Array{Float64,1}, ::Int64) at ./array.jl:512
in include_string(::String, ::String) at ./loading.jl:441
in eval(::Module, ::Any) at ./boot.jl:234
in (::Atom.##67#70)() at /home/crackauc/.julia/v0.5/Atom/src/eval.jl:40
in withpath(::Atom.##67#70, ::Void) at /home/crackauc/.julia/v0.5/CodeTools/src/utils.jl:30
in withpath(::Function, ::Void) at /home/crackauc/.julia/v0.5/Atom/src/eval.jl:46
in macro expansion at /home/crackauc/.julia/v0.5/Atom/src/eval.jl:109 [inlined]
in (::Atom.##66#69)() at ./task.jl:60
了解如何在不每次都完全重新分配矩阵的情况下完成此操作是有帮助的。提前致谢。
【问题讨论】:
-
为什么不能只分配一个新矩阵?调整大小会为您带来什么?
-
如果我调整为更小的矩阵,我不需要重新分配。如果我调整大小,它应该像向量一样摊销。如果我反复这样做,那应该会更快。
-
更详细一点:它通过
ForwardDiff.jacobian!加载,然后用于\ 操作。就是这样。我可以看到from this page of the source,为了使其高效,它只需要很好地索引,但我不确定它是否可以很好地与 \ 操作一起使用。
标签: arrays memory-management julia