您的代码花费一些时间用零填充分配的Matrix,更快的版本是:
struct Foo
alpha :: Array{Float64,2}
beta :: Array{Float64,2}
function Foo(nrow::Int,ncol::Int)
new( Matrix{Float64}(undef, nrow, ncol),
Matrix{Float64}(undef, nrow, ncol) );
end
end
这当然会导致数组一开始就存在一些数据。
您可以考虑将对象的大小作为其类型定义的一部分:
Base.@kwdef struct Foo2{N,M}
alpha::Array{Float64,2} = zeros(Float64, N, M)
beta::Array{Float64,2} = zeros(Float64, N, M)
end
请注意,我使用 Base.@kwdef 生成了一个构造函数,这会导致代码更短。
我使用zeros 是为了便于阅读,但是undef 构造函数的使用方式与上例类似。
这个struct可以简单地用作:
julia> Foo2{2,3}()
Foo2{2, 3}([0.0 0.0 0.0; 0.0 0.0 0.0], [0.0 0.0 0.0; 0.0 0.0 0.0])
上述“将我的尺寸存储在类型中”的方法更多的是关于样式而不是性能,除非您开始编写代码来实际使用这些信息。
最简单的开始方法是通过StaticArrays:
using StaticArrays
Base.@kwdef struct Foo3{N,M}
alpha::MMatrix{N,M,Float64} = MMatrix{N,M}(zeros(Float64, N, M))
beta::MMatrix{N,M,Float64} = MMatrix{N,M}(zeros(Float64, N, M))
end
这个struct又可以用作:
julia> Foo3{2,3}()
Foo3{2, 3}([0.0 0.0 0.0; 0.0 0.0 0.0], [0.0 0.0 0.0; 0.0 0.0 0.0])
静态数组要快得多,但编译时需要大量类型。基本上,将它们用于具有多达 50 个元素的数组是有意义的。