我正在尝试创建一个向量树的条目的函数。该函数不应返回任何内容,只需修改输入的条目。
例如,函数:
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未更新!为什么会这样?
如果有人能帮助我,我真的很感激吗?
编辑:我得到了代码,但只有当我从控制台调用它时。当我在脚本中调用它时,它什么都不做!谢谢,
尼西
答案 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]))
再次如期待。