在Julia中,我有一个数组数组,说:
arr = Array(Array{Float64,1},3)
for i = 1:3
arr[i] = [i,-i]
end
Run Code Online (Sandbox Code Playgroud)
现在:
arr[:][1]
2-element Array{Float64,1}:
1.0
-1.0
Run Code Online (Sandbox Code Playgroud)
和
arr[1][:]
2-element Array{Float64,1}:
1.0
-1.0
Run Code Online (Sandbox Code Playgroud)
似乎获得第一个“列”的唯一方法是通过理解
pluses = [arr[i][1] for i=1:length(arr)]
3-element Array{Any,1}:
1.0
2.0
3.0
Run Code Online (Sandbox Code Playgroud)
那确实是唯一的方法吗?我是否通过运行for循环而不是某些“向量化”版本而失去速度,还是在Julia中由于编译器不同而无关紧要吗?
使用[]索引无法做到这一点。每个[]操作都是一个独立的操作(调用getindex)。您已经尝试通过调用来“切片”嵌套数组arr[:][1]。这里有两个独立的操作:首先是,(arr[:])然后是(arr[:])[1]。但是在这种情况下arr[:] == arr!同样地,arr[1][:]您只需获取第一个向量的所有元素。这就是为什么两个人返回同一件事的原因。
您的理解力是一个很好的解决方案。与旧版本的MATLAB不同,Julia的JIT使得for循环的速度比矢量化替代方法要快。如果您来自Matlab或Python,这需要一些习惯。但是,它允许您以非常有效的方式遍历这些复杂的结构。
关于您的评论,在这种情况下,他们使用向量的向量而不是在多维数组中添加列的原因是,目前只有向量可以增长。您可以通过调用将向量的向量复制到二维数组中hcat(arr...),但是如果向量很大(数百万个元素),则复制本身会非常慢。
*(最近的Matlab版本也有JIT,它也可以使某些 for循环比矢量化更快,但是当它启动时是不可预测的。对于这些循环,如今这些日子几乎总是比带有自定义函数的arrayfun / cellfun快。我的经验)。
| 归档时间: |
|
| 查看次数: |
3131 次 |
| 最近记录: |