我尝试了以下方法,并且有效。
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]
答案 0 :(得分:3)
这里的问题是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]
,依此类推。这应该可以解释为什么您会得到奇怪的结果。
除了奥斯卡·史密斯(Oscar Smith)在其评论中提到的广播a .= a .* a
或a .= a .^ 2
,您还可以使用功能map
a = map(x -> x^2, a)
或map!
:
map!(x -> x^2, a, a)
map
和map!
之间的区别在于,map
创建了一个新版本,而map!
写入了一个已经存在的集合中。在此示例中,输入集合与输出集合相同。