Как определить многомерные структуры внутри Юлии? - PullRequest
1 голос
/ 25 октября 2019

Я пытаюсь определить матричные структуры. Как мне их определить? Например, определяя матрицу, подобную этой:

struct Mat
    r11::Float64
    r12::Float64
    r21::Float64
    r22::Float64
end

Но когда матрица большая, она не может быть написана таким образом. Как определить многомерные матрицы, чтобы они были эффективными и быстрыми при добавлении, вычитании и т. Д.

1 Ответ

5 голосов
/ 25 октября 2019

Лучший способ - использовать уже существующие StaticArrays. Это высококачественный, хорошо обслуживаемый пакет, который реализует структуры, подобные матрице.

StaticArrays использует NTuple в качестве базовых данных, что означает, что они могут различаться по длине. Его определение типа выглядит примерно так:

struct StaticMatrix{T, R, C, N}
    data::NTuple{N, T}
end

Операции со статическими массивами чрезвычайно эффективны. Например:

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)
...