在Julia中切片数组的数组

4
在Julia中,我有一个数组的数组,例如:
    arr = Array(Array{Float64,1},3)
    for i = 1:3
        arr[i] = [i,-i]
    end

现在:

   arr[:][1]
   2-element Array{Float64,1}:
      1.0
     -1.0

并且

   arr[1][:]
    2-element Array{Float64,1}:
     1.0
    -1.0

看起来只有通过推理才能获得第一个“列”

    pluses = [arr[i][1] for i=1:length(arr)]
    3-element Array{Any,1}:
     1.0
     2.0
     3.0

那确实是唯一的方法吗?使用for循环而不是某种“向量化”版本会降低速度,还是在Julia中由于不同的编译器而无关紧要?


5
你真的需要一个二维数组吗?为什么不直接使用矩阵呢?通常情况下,Julia没有很多处理嵌套数组的工具;你应该尽可能使用多维数组。你可以以任何你想要的方式对矩阵进行切片 :) - James Porter
可能有解决方法。这种结构在这个教程中出现,其中定义了一个具有类型Vector的字段的类型。例如:type Body{T}\n\tvelocity::Vector{T}\n\tend。然后,在求解微分方程时,将项目附加到velocity字段的实例。我仍在消化这个问题,所以还没有关于如何使用多维数组实现相同结果的想法... - nikosd
2个回答

11
在 Julia 0.5 或之后版本中,您可以使用 getindex.(arr, 1) 来提取 arr 数组中每个数组的第一个元素。这非常高效,特别是它可以使用“点调用”语法与其他逐元素操作进行融合。请参考此链接

7
这不能通过使用[]索引来完成。每个[]操作都是独立的操作(调用getindex)。您已尝试通过调用arr[:][1]对嵌套数组进行“切片”。这里有两个独立的操作:首先是(arr[:]),然后是(arr[:])[1]。但在这种情况下,arr[:] == arr!对于arr[1][:]也是如此 - 您只是获取第一个向量的所有元素。这就是为什么两者返回相同结果的原因。
您的理解是一个好的解决方案。与旧版本的MATLAB不同,Julia的JIT使for循环比向量化的替代方法更快。如果您从Matlab或Python转移过来,需要一些时间来适应它。但它允许您以非常高效的方式遍历这些复杂的结构。
关于您的评论,他们在这种情况下使用向量的向量而不是将列添加到多维数组中的原因是当前只有向量可以增长。您可以通过调用hcat(arr...)将您的Vector of Vectors复制到二维数组中,但如果您的向量非常大(数百万个元素),则复制本身会相当慢。
(最近的Matlab版本也有JIT,它可以使一些for循环比向量化更快,但是何时启动是不可预测的。在我的经验中,现在几乎总是比使用自定义函数的arrayfun/cellfun更快)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接