Насколько я могу судить, Джулия не поддерживает один и тот же стиль одновременного множественного расширенного индексирования для назначения. Итак, вам может потребоваться использовать цикл for для достижения желаемого результата:
julia> A = zeros(Int, 4, 4)
4×4 Matrix{Int64}:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
julia> idx = [(1, 1), (2, 1), (3, 3)]
3-element Vector{Tuple{Int64, Int64}}:
(1, 1)
(2, 1)
(3, 3)
julia> for (i, j) in idx
A[i, j] = 1
end
julia> A
4×4 Matrix{Int64}:
1 0 0 0
1 0 0 0
0 0 1 0
0 0 0 0
Спасибо за ответ, это не совсем то, что я хотел. Я изменил один из индексов в вопросе на (3,3)
.
Понятно, в Джулии этого сделать невозможно. Но, возможно, кто-то другой ответит.
Спасибо, да, я думаю, это единственный способ сделать это... Я приму ваш ответ.
Следующее работает (хотя цикл for
, вероятно, будет более эффективным).
A[CartesianIndex.([(1,1), (2,1), (3,3)])] .= 1
Или A[CartesianIndex.(zip([1,2,3], [1,1,3]))] .= 1; A
Следующее согласуется с замечанием Оскара Смитса о вероятной эффективности производительности.
# Julia 1.10.5
using BenchmarkTools
A = zeros(Int64, 100, 100)
xs = [rand(1:100) for x in 1:100]
ys = [rand(1:100) for y in 1:100]
zs = zip(xs, ys)
@btime ($A)[CartesianIndex.(zip($xs,$ys))] .= 1; nothing
# ... ns (2 allocations: 3.58 KiB)
@btime ($A)[CartesianIndex.($zs)] .= 1; nothing
# ... ns (2 allocations: 3.58 KiB)
@btime for (x, y) in zip($xs, $ys); ($A)[x,y] = 1; end
# ... ns (0 allocations: 0 bytes)
@btime for (x, y) in $zs; ($A)[x,y] = 1; end
# ... ns (0 allocations: 0 bytes)
это явно не то, о чем я спрашиваю. Я хочу, чтобы конкретный элемент был 1, а не все.