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