我们应该如何在Julia内部定义多维度结构?

bit*_*ise 1 julia

我正在尝试定义类似矩阵的结构。我应该如何定义它们?例如,定义这样的矩阵:

struct Mat
    r11::Float64
    r12::Float64
    r21::Float64
    r22::Float64
end
Run Code Online (Sandbox Code Playgroud)

但是,当矩阵很大时,就不能这样写。添加,减去等后,我应如何定义多维矩阵以提高存储效率并提高存储效率。

Jak*_*sen 5

最好的方法是使用已经存在的StaticArrays。这是一个高质量,维护良好的软件包,可实现类似Matrix的结构。

StaticArrays使用一个NTuple作为基础数据,这意味着它的长度可以变化。它的类型定义是这样的:

struct StaticMatrix{T, R, C, N}
    data::NTuple{N, T}
end
Run Code Online (Sandbox Code Playgroud)

静态数组上的操作非常高效。例如:

julia> using StaticArrays

julia> a = SMatrix{2,2}(rand(4));

julia> code_native(+, Tuple{typeof(a), typeof(a)}, debuginfo=:none)
    .text
    vmovupd (%rsi), %ymm0
    vaddpd  (%rdx), %ymm0, %ymm0
    vmovupd %ymm0, (%rdi)
    movq    %rdi, %rax
    vzeroupper
    retq
    nopw    %cs:(%rax,%rax)
Run Code Online (Sandbox Code Playgroud)