1

我尝试了以下方法并且它有效。

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],这是我想要的产品,elementwise product。

但是,我尝试使用相同的方法来获得我想要的产品,但没有奏效。

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]
4

1 回答 1

3

这里的问题是,这replace可能无法满足您的要求。命令

replace(A, old => new)

接受一个集合A并创建一个新集合,其中每次出现的old都替换为new.

因此,如果我们查看您的示例,在第一次迭代中,我们会替换每次出现的a[1] == 2by 4。这产生

a == [4, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

在第二次迭代中,我们将每次出现的a[2] == 4by替换掉16。这产生

a == [16, 16, 8, 16, 32, 64, 128, 256, 512, 1024]

等等。这应该可以解释为什么你会得到那个奇怪的结果。

除了广播a .= a .* aa .= a .^ 2奥斯卡史密斯在他的评论中提到的,您还可以使用这些功能map

a = map(x -> x^2, a)

map!

map!(x -> x^2, a, a)

map和之间的区别在于map!,它map创建一个新版本并map!写入一个已经存在的集合。在此示例中,输入集合与输出集合相同。

于 2020-04-18T11:35:29.360 回答