Итератор по всем, кроме одного индекса в Юлии - PullRequest
1 голос
/ 04 октября 2019

я пытаюсь написать общую тензорную операцию в юлии (матрица * тензор известного ранга).

Мой тензор - это объект с n индексами (например, тензор (a_1, a_2, ..., a_n)), и моя матрица влияет только на i-й индекс. Поэтому было бы удобно иметь итератор с обходом каждого индекса, кроме i-го. Есть ли простая функция для реализации этого, или у вас есть идея? Как это сделать с хорошей производительностью? Мне также нужен результат итератора в CartesianIndex-форме (я думаю), потому что я должен перебирать последний индекс в стиле умножения матрицы на вектор.

Моя первая идея состояла в том, чтобы получить все перестановки для индексов до и после i-го, но генерация этих показалась утомительной ...

Я надеюсь, вы можете помочь мне, с наилучшими пожеланиями, lepmueller

Ответы [ 2 ]

4 голосов
/ 04 октября 2019

Непонятно, что именно вы ищете. Вы можете получить итератор для индексов, которые игнорируют i-ую строку матрицы, например

Iterators.filter(x->x[1] != i, CartesianIndices(a))

Это полезно для вас, или вы можете отредактировать вопрос, чтобы он был более явным?

3 голосов
/ 06 октября 2019

FWIW, есть также небольшой пакет под названием InvertedIndices.jl , который позволяет вам удалять определенные столбцы / строки, например:

julia> using InvertedIndices

julia> x = rand(4,4)
4×4 Array{Float64,2}:
 0.779118  0.66097   0.335433  0.583011
 0.284284  0.799394  0.353914  0.146769
 0.716189  0.605426  0.2449    0.92238
 0.140876  0.210152  0.810854  0.37236

julia> x[Not(2), Not(4)] # drop second row and 4th column
3×3 Array{Float64,2}:
 0.779118  0.66097   0.335433
 0.716189  0.605426  0.2449
 0.140876  0.210152  0.810854
...