Проблема в том, что replace
может не делать то, что вы хотите. Команда
replace(A, old => new)
берет коллекцию A
и создает новую коллекцию, в которой каждое вхождение old
заменяется на new
.
Итак, если мы посмотрим на ваш пример, в первой итерации мы заменяем каждое вхождение a[1] == 2
на 4
. Это дает
a == [4, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
Во второй итерации мы заменяем каждое вхождение a[2] == 4
на 16
. Это дает
a == [16, 16, 8, 16, 32, 64, 128, 256, 512, 1024]
и так далее. Это должно объяснить, почему вы получаете этот странный результат.
Помимо трансляций a .= a .* a
или a .= a .^ 2
, которые Оскар Смит упомянул в своем комментарии, вы также можете использовать функции map
a = map(x -> x^2, a)
или map!
:
map!(x -> x^2, a, a)
Разница между map
и map!
заключается в том, что map
создает новую версию и map!
записывает в уже существующую коллекцию. В этом примере входная коллекция совпадает с выходной коллекцией.