【问题标题】:Resizing a matrix调整矩阵大小
【发布时间】: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


【解决方案1】:

您正在涉足一些危险的领域(该警告是有原因的),但如果您不打电话给reshape(Jvec, 3, 3),那么您会这样做

J = Base.ReshapedArray(Jvec,(3,3), ())

那么它可能会如您所愿。

【讨论】:

  • 看起来有效。 “你正在踏上一些危险的领域”。危险听起来很有趣。
【解决方案2】:
julia> J = rand(3,3);

julia> Jvec = vec(J);

julia> resize!(Jvec, 4*4);

julia> J = reshape(Jvec, (4,4));

julia> Jvec = vec(J);

julia> resize!(Jvec, 5*5);

julia> J = reshape(Jvec, (5,5))

等工作。

【讨论】:

  • 如果在生成新的J 之前更改Jvec 中的值,您会看到它创建了一个新向量。看起来它没有,因为它复制了值,但 J 和 Jvec 之间的链接已损坏,大概是为了阻止我的解决方案中的问题。
猜你喜欢
  • 1970-01-01
  • 2017-10-08
  • 2015-12-02
  • 2013-10-11
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多