Julia:如何正确定义一个使用依赖于数字的类型的函数?

时间:2017-10-31 12:59:30

标签: arrays julia

我使用数组,但我不需要在任何时候更改长度,但同时我在编写代码时不知道它们的长度。只有当我需要创建它们时才知道它的长度。

特别是我使用的是StaticArrays,我想定义一个f(v::MVector{N,Float64})类型的函数,它将接受任意长度的MVector作为输入。我该如何输入?

1 个答案:

答案 0 :(得分:7)

对于一个运行的例子,假设我们有一个固定长度的向量mv,但我们只知道它在运行时的长度。它可以这样定义:

julia> using StaticArrays

julia> mv = @MVector rand(4)
4-element MVector{4,Float64}:
 0.978253
 0.691035
 0.988942
 0.770601

要定义一个对此向量进行操作的函数,我们可以写:

julia> mysum(v::MVector{N,Float64}) where {N} = sum(v)

请注意where {N}符号,使其符合所有固定大小。

但这是不必要的。写作:

julia> mysum2(v) = sum(v)

可以优化特定长度,即使在运行时也是如此,因为为每种类型的参数编译了新版本的函数。这是因为Julia根据参数类型专门设计了一个函数。 MVectors包括其类型的长度,因此在运行时生成并使用此长度的专用函数。