Этот ответ привел меня к другому вопросу:
При определении новой структуры, подобной этой:
struct ReversedRowMajor{T,A} <: AbstractMatrix{T}
data::A
end
ReversedRowMajor(data::AbstractMatrix{T}) where {T} = ReversedRowMajor{T, typeof(data)}(data)
Base.size(R::ReversedRowMajor) = reverse(size(R.data))
Base.getindex(R::ReversedRowMajor, i::Int, j::Int) = R.data[end-j+1, end-i+1]
Если R
- массив ReversedRowMajor
, при доступе к R[:,:]
Джулия будет перебирать CartesianIndices
в порядке, который должен быть самым быстрым для массива, т.е. в порядке памяти (см. советы по производительности массива ) но в данном случае это не ожидаемый результат, поскольку мы переставляем индексы: (i, j) → (end-j + 1, end-i + 1).
Итак, вопрос в том, что, учитывая массив, есть ли способ сообщить Джулии, какая ось самая быстрая?
(см. Также Многомерные алгоритмы и итерации )