Присвоение в матрицах с использованием двойных индексов

#julia

#julia

Вопрос:

Я не могу понять, как добиться такого поведения:

Из этой матрицы:

 julia> a = [1 1 1; 1 1 1; 1 1 2]
3×3 Array{Int64,2}:
 1  1  1
 1  1  1
 1  1  2
  

Я хочу изменить все единицы на 5, но только в последней строке.

Что я сделал a[3, :][a[3, :] .== 1] .= 5 , так это то, что значение a не изменилось.

Я заметил, что с:

 foo[foo .== 1] .= 5
a[3,  :] = foo
  

Это работает, но я пытаюсь уменьшить распределение, и это следует удалить.

Заранее спасибо

Ответ №1:

Вы можете использовать @view и replace! :

 julia> a = [1 1 1
            1 1 1
            1 1 2]
3×3 Array{Int64,2}:
 1  1  1
 1  1  1
 1  1  2

julia> replace!(@view(a[end, :]), 1 => 5)
3-element view(::Array{Int64,2}, 3, :) with eltype Int64:
 5
 5
 2

julia> a
3×3 Array{Int64,2}:
 1  1  1
 1  1  1
 5  5  2
  

Ответ №2:

Проблема a[3, :][a[3, :] .== 1] .= 5 такая же, как getindex(a, 3, :)[a[3, :] .== 1] .=5

getindex возвращает копию той части a , в которой вы изменяете копию, а не оригинал a

Вы хотите использовать view
view(a, 3, :)[a[3, :] .== 1] .=5

Вы также можете сделать это с @view @views помощью макроса or .