arrays - 用数组填充数组不像我预期的那样工作
问题描述
我想创建一个多个数组,其条目是多个数组,并且想将某个数组一个接一个地推送到条目中。
例如,我创建了 2 x 3 Matrix 命名arr
并尝试用 4 x 4 Matrix 生成的 [1,1] 和 [1,2] 条目填充randn(4,4)
.
arr = fill(Matrix{Float64}[], 2, 3)
push!(arr[1,1],randn(4,4))
push!(arr[1,2],randn(4,4))
println(arr[1,1])
println(arr[1,2])
println(arr[1,3])
但是,结果是arr
(除了 [1,1] 和 [1,2] 之外)的所有条目都填充了相同的randn(4,4)
,而不仅仅是 [1,1] 和 [1,2] 填充了randn(4,4)
:
[[-0.15122805007483328 0.6132236453930502 -0.9090110366765862 1.2589924202099898; -1.120611384326006 -0.9083935218058066 0.7252290006516056 1.0970416725786256; -0.19173238706933265 1.3610525411901113 -0.05258697093572793 0.7776085390912448; 0.18491459001855373 -2.0537142669734934 0.3482557186126859 0.0047622478008474845], [0.23422967703060255 -0.51986351753462 0.45947166573674303 0.31316899298864387; 0.3704450103622709 -0.8186574197233013 -0.9990329964554037 -0.8345957519924763; 0.56641529964098 -0.8393435538481216 -0.6379336546939682 1.1843452368116358; 0.9435767553275002 0.0033471181565433127 -1.191611491619908 1.3970554854927264]]
[[-0.15122805007483328 0.6132236453930502 -0.9090110366765862 1.2589924202099898; -1.120611384326006 -0.9083935218058066 0.7252290006516056 1.0970416725786256; -0.19173238706933265 1.3610525411901113 -0.05258697093572793 0.7776085390912448; 0.18491459001855373 -2.0537142669734934 0.3482557186126859 0.0047622478008474845], [0.23422967703060255 -0.51986351753462 0.45947166573674303 0.31316899298864387; 0.3704450103622709 -0.8186574197233013 -0.9990329964554037 -0.8345957519924763; 0.56641529964098 -0.8393435538481216 -0.6379336546939682 1.1843452368116358; 0.9435767553275002 0.0033471181565433127 -1.191611491619908 1.3970554854927264]]
[[-0.15122805007483328 0.6132236453930502 -0.9090110366765862 1.2589924202099898; -1.120611384326006 -0.9083935218058066 0.7252290006516056 1.0970416725786256; -0.19173238706933265 1.3610525411901113 -0.05258697093572793 0.7776085390912448; 0.18491459001855373 -2.0537142669734934 0.3482557186126859 0.0047622478008474845], [0.23422967703060255 -0.51986351753462 0.45947166573674303 0.31316899298864387; 0.3704450103622709 -0.8186574197233013 -0.9990329964554037 -0.8345957519924763; 0.56641529964098 -0.8393435538481216 -0.6379336546939682 1.1843452368116358; 0.9435767553275002 0.0033471181565433127 -1.191611491619908 1.3970554854927264]]
怎么了?任何信息,将不胜感激。
解决方案
当您将arr = fill(Matrix{Float64}[], 2, 3)
所有 6 个元素都指向内存中完全相同的位置时,因为fill
不会进行深度复制 - 它只是复制引用。基本上,fill
当第一个参数可变时使用通常不是一个好主意。
因此,您真正想要的是:
arr = [Matrix{Float64}[] for i in 1:2, j in 1:3]
现在每个6
插槽在内存中都有自己的地址。
推荐阅读
- angular - 使用角度库时在 NodeInjector 中找不到 NgControl 提供程序
- python - 在服务器上本地工作失败,无法同时为两个用户运行
- python - 在 PyTest 中的测试模块结束时断开夹具的连接
- vb.net - 使用 LINQ 从 access 数据库设置登录页面
- java - 更新子 firebase 并删除子
- arrays - React typescript - 如何处理列表中的多个列表
- linux - 我在哪里可以找到关于 aarch64-poky-linux-ld 的文档?
- express - ${port} 不突出显示为变量
- bash - 未找到 EC2 非 root 用户的 python3 命令
- lua - 尝试索引 nil 值(本地“结果”)错误