【问题标题】:Initializing an empty array in Julia with a large number of arrays inside在 Julia 中初始化一个空数组,其中包含大量数组
【发布时间】:2019-08-12 02:08:12
【问题描述】:

我试图在 Julia 1.1 中用 6 个元素初始化一个空数组,其中 i-th 元素由 1000 个数组组成,这些数组将被一个循环填充。例如,如果i-th 元素包含 3 个数组,我可以做fill([Array{Float64,1},Array{Float64,1} ,Array{Float64,1}],6,1)。但是如何在不复制Array{Float64,1} 1000 次的情况下获得空的 1000 个数组呢?

【问题讨论】:

  • 很难理解你的问题。如果您的数组为空,则它不能包含 6 个元素。另外,你想要一个数组数组还是数组数组?最后,Array{Float64}s 不是数组,它们是类型变量。
  • 哦,还有,您是要初始化还是预分配
  • 我想创建一个空对象来用 for 循环填充值。我有一个包含 6 个值的数组,我将对其应用一个函数 1000 次。该函数返回一个 {Float64,1} 类型的数组。所以,我的空数组将是我想要存储函数返回的 1000 个数组的地方,对于我拥有的 6 个值;-)

标签: arrays initialization julia


【解决方案1】:

一些例子取决于你想要做什么:

空数组集:

julia> [[Float64[] for a in 1:3] for b in 1:6]
6-element Array{Array{Array{Float64,1},1},1}:
 [[], [], []]
 [[], [], []]
 [[], [], []]
 [[], [], []]
 [[], [], []]
 [[], [], []]

大小为6x3x2 的未初始化三维数组(也许拥有一个 3D 数组实际上比 Array of Arrays of Arrays 更方便 - 取决于您的用例):

julia> Array{Float64,3}(undef, 6, 3, 2)
6×3×2 Array{Float64,3}:
[:, :, 1] =
 9.00033e-316  1.52477e-315  1.52473e-315
 7.95655e-316  1.52477e-315  1.52473e-315
 1.52474e-315  8.18796e-316  1.52477e-315
 7.95655e-316  1.52477e-315  1.52474e-315
 1.52474e-315  1.52473e-315  1.52474e-315
 8.03142e-316  1.52473e-315  1.52477e-315

[:, :, 2] =
 7.97808e-316  1.52473e-315  0.0
 8.07774e-316  1.52474e-315  0.0
 1.52474e-315  1.52473e-315  0.0
 1.52474e-315  1.52473e-315  0.0
 7.96305e-316  0.0           0.0
 1.52473e-315  0.0           0.0

分配的未初始化数组集:

julia> [[Vector{Float64}(undef,2) for a in 1:3] for b in 1:6]
6-element Array{Array{Array{Float64,1},1},1}:
 [[1.60704e-315, 1.60693e-315], [5.93041e-316, 1.69135e-315], [1.69002e-315, 1.69135e-315]]
 [[5.93223e-316, 5.93223e-316], [5.92882e-316, 4.94066e-324], [5.93223e-316, 5.93223e-316]]
 [[5.92884e-316, 2.122e-314], [5.92883e-316, 1.60853e-315], [5.93041e-316, 5.92887e-316]]
 [[1.69002e-315, 5.92885e-316], [1.60705e-315, 1.60693e-315], [5.93041e-316, 1.69136e-315]]
 [[1.69002e-315, 1.69136e-315], [5.93223e-316, 5.93223e-316], [5.92882e-316, 5.93043e-316]]
 [[5.93223e-316, 5.93223e-316], [5.92884e-316, 5.93043e-316], [5.92883e-316, 5.93223e-316]]

【讨论】:

  • 哦,太好了!创造我想要的东西的非常有用的方法:-)
  • 这个答案有一个大问题:混叠。在第一个和第三个示例中,您都在使用对同一数组的引用填充结构。尝试A = fill(fill(Float64[],3),6,1),然后尝试push!(A[1][1], 1234)。所有的数组都是一样的。
  • @DNF,是的,你是对的 - 我应该改用理解。我将答案编辑为正确,感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 2021-08-22
  • 2016-04-27
  • 1970-01-01
  • 2018-02-23
  • 2012-08-03
  • 1970-01-01
相关资源
最近更新 更多