Как мне сказать Джулии, в каком порядке выполнять итерации в массиве? - PullRequest
0 голосов
/ 29 марта 2019

Этот ответ привел меня к другому вопросу:

При определении новой структуры, подобной этой:

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

Итак, вопрос в том, что, учитывая массив, есть ли способ сообщить Джулии, какая ось самая быстрая?

(см. Также Многомерные алгоритмы и итерации )

...