使用julia中的函数调用更新向量

时间:2018-01-28 21:24:48

标签: julia

我正在尝试创建一个向量树的条目的函数。该函数不应返回任何内容,只需修改输入的条目。

例如,函数:

function updatevec1!(A::Matrix, v::Vector)
 v .= A*v
end

在矩阵乘法后更新矢量(矢量v=[1;2]更新为v=[5;11]矩阵A =[1,2;3,4])。现在在我的代码中,我介绍了以下递归类型。

abstract type gtree end

  struct gtreeleaf<:gtree
   v::Vector
  end

  struct gtreenode<:gtree
    v::Vector
    left::gtree
    right::gtree
  end

现在假设我想为gtreenode做同样的事情。

 function updatevec2!(A::Matrix, g::gtreenode)
   g.left.v .= A*g.left.v
 end

现在如果想要跑:

g = gtreenode([1], gtreeleaf([1;2]), gtreeleaf([1;2]) )
updatevec2!([1,2;3,4],g)

树g未更新!为什么会这样?

如果有人能帮助我,我真的很感激吗?

编辑:我得到了代码,但只有当我从控制台调用它时。当我在脚本中调用它时,它什么都不做!

谢谢,

尼西

2 个答案:

答案 0 :(得分:0)

这是你想要的吗?

function updatevec!(A::Matrix, v::Vector)
  v .= A * v
end

以下是执行上述定义函数的结果:

julia> x = [1,2]
2-element Array{Int64,1}:
 1
 2

julia> A = [1 2; 3 4]
2×2 Array{Int64,2}:
 1  2
 3  4

julia> updatevec!(A, x)
2-element Array{Int64,1}:
  5
 11

julia> x
2-element Array{Int64,1}:
  5
 11

答案 1 :(得分:0)

不知道这应该是答案还是评论,但我不能重现你的问题。在一个新鲜的朱莉娅REPL我得到:

julia> abstract type gtree end;

julia>   struct gtreeleaf<:gtree
          v::Vector
         end;

julia>   struct gtreenode<:gtree
           v::Vector
           left::gtree
           right::gtree
         end;

julia> function updatevec2!(A::Matrix, g::gtreenode)
          g.left.v .= A*g.left.v
        end
updatevec2! (generic function with 1 method)

julia> g = gtreenode([1], gtreeleaf([1;2]), gtreeleaf([1;2]) );

julia> updatevec2!([1 2;3 4],g)
2-element Array{Int64,1}:
  5
 11

julia> g
gtreenode([1], gtreeleaf([5, 11]), gtreeleaf([1, 2]))

正如所料。

更新(根据OP的编辑):

也适用于脚本。这是我的test.jl

abstract type gtree end;

struct gtreeleaf<:gtree
          v::Vector
         end;

struct gtreenode<:gtree
           v::Vector
           left::gtree
           right::gtree
         end;

function updatevec2!(A::Matrix, g::gtreenode)
          g.left.v .= A*g.left.v
        end

g = gtreenode([1], gtreeleaf([1;2]), gtreeleaf([1;2]) );

println(g)
updatevec2!([1 2;3 4],g)

println(g)

当我运行它时,我得到输出

gtreenode([1], gtreeleaf([1, 2]), gtreeleaf([1, 2]))
gtreenode([1], gtreeleaf([5, 11]), gtreeleaf([1, 2]))

再次如期待。