Юля - заменить - PullRequest
       5

Юля - заменить

1 голос
/ 17 апреля 2020

Я попробовал следующий метод, и он сработал.

a=[1,2,3]
b=[5,6,7]

for i=1:3
    a=replace(a,a[i]=>b[i]*a[i])
end

Результат показал: a = [5,12,21], то есть продукт, который я хотел, поэлементный продукт.

Однако я пытался использовать тот же метод для получения нужного продукта, но он не работал.

a=[]
for i=1:10
    a=push!(a,2^i)
end

for i=1:10
    a=replace(a,a[i]=>a[i]*a[i])
end

Но результат

a=[65536,65536,4096,65536,1048576,4096,16384,65536,262144,1048576]

И я хочу доходность

a=[4,16,64,256,1024,4096,16384,65536,262144,1048576]

1 Ответ

3 голосов
/ 18 апреля 2020

Проблема в том, что 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! записывает в уже существующую коллекцию. В этом примере входная коллекция совпадает с выходной коллекцией.

...