在Julia中向函数内的矩阵添加一行(并将更改传播到外部)?

bec*_*cko 2 matrix julia

这类似于这个问题:

在Julia的矩阵中添加一行?

但现在我想在函数中增长矩阵:

function f(mat)
    mat = vcat(mat, [1 2 3])
end
Run Code Online (Sandbox Code Playgroud)

现在,在这个功能之外:

mat = [2 3 4]
f(mat)
Run Code Online (Sandbox Code Playgroud)

但这不起作用.对mat内部所做的更改f不会传播到外部,因为mat内部创建了一个新内容f(请参阅http://docs.julialang.org/en/release-0.4/manual/faq/#functions).

有可能做我想要的吗?

Fen*_*ang 7

多维数组的大小不能改变.有指针黑客共享数据,但这些不会修改原始数组的大小.


即使有可能,也要注意因为Julia矩阵是列专业,这个操作非常慢,并且需要数组的副本.

在朱,该修改在传递(即,执行计算的数据操作的数据,而不是数据)通常标有!.这表示程序员将修改正在处理的集合.这些类型的操作通常称为"就地"操作,因为虽然它们更难以使用和推理,但它们避免使用额外的内存,并且通常可以更快地完成.

由于矩阵存储在内存中,因此无法避免此操作的副本.因此,将此特定操作转换为就地操作并没有多少实际好处.因此,我建议不要这样做.


如果由于某种原因确实需要此操作,则不应使用矩阵,而应使用向量向量:

v = Vector{Float64}[]
push!(v, [1.0, 2.0, 3.0])
Run Code Online (Sandbox Code Playgroud)

此数据结构访问速度稍慢,但添加速度快得多.

另一方面,从它的声音来看,您可能对更专业的数据结构感兴趣,例如a DataFrame.