Добавляя мои 2 ¢ для завершения,
Джулия поддерживает линейные индексы «столбцов-мажорных порядков», такие как matlab (хотя я отмечаю, что Julia 1.0 устарела как эквивалентные функции sub2ind
и ind2sub
matlab)).
Поэтому, если бы вы могли выразить (или уже имели) свои координаты в форме "линейных индексов", вы могли бы использовать их непосредственно для индексации.
На практике, в текущем состоянииЧто касается Джулии, это не сильно отличается от использования декартового индекса, но в некоторых случаях может быть предпочтительнее, например, если вы знаете, что будете использовать эти индексы для дальнейших операций или для читабельности / перехода от кода Matlab и т. д.
Например,
julia> A = copy( reshape( 10:10:160, (4,4) )' )
4×4 Array{Int64,2}:
10 20 30 40
50 60 70 80
90 100 110 120
130 140 150 160
julia> pv = [1,3,4]; pq = [2,1,4];
julia> A_linearIndices = LinearIndices(A)
4×4 LinearIndices{2,Tuple{Base.OneTo{Int64},Base.OneTo{Int64}}}:
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
julia> L = [ A_linearIndices[i...] for i in zip(pv, pq) ]
3-element Array{Int64,1}:
5
3
16
julia> A[L]
3-element Array{Int64,1}:
20
90
160
julia> A[L] .= 0; A
4×4 Array{Int64,2}:
10 0 30 40
50 60 70 80
0 100 110 120
130 140 150 0
Сказав, что, если вы хотите сохранить что-то для последующей индексации, вы также можете сохранить булеву матрицу для логической индексации с помощью того же подхода.
РЕДАКТИРОВАТЬ : Код отредактирован для отображения назначения также с помощью линейного индекса.Обратите внимание, что я должен был сделать A правильным массивом, а не хранить его как объект «ReshapedArray», так как последний жалуется, если вы пытаетесь индексировать его напрямую.