朱莉娅:对于"额外"的数组大小和索引的理性。尺寸是多少?

时间:2018-01-12 12:39:17

标签: arrays julia

我不时使用Julia,但我对以下行为感到惊讶:

让我们定义一个3x4数组

julia> m=rand(3,4)
3×4 Array{Float64,2}:
 0.889018  0.500847  0.539856  0.828231 
 0.492425  0.582958  0.521406  0.754102 
 0.28227   0.834333  0.669967  0.0939701

现在我检查一下

julia> size(m,1), size(m,2)
(3, 4)

正如所料。

然而,我对此感到惊讶:

julia> size(m,3), size(m,2018)
(1, 1)

- >我原以为(0,0)error message

查看Julia代码可以确认此行为:

size(t::AbstractArray{T,N}, d) where {T,N} = d <= N ? size(t)[d] : 1

此外

julia> m[2,1,1,1,1]
0.4924252391289974

- &GT;我原以为out of bounds error

所以我的问题是:&#34;理由是什么?&#34; (我不认为这是一个错误,我使用Julia版本0.6.2)

1 个答案:

答案 0 :(得分:3)

我相信这是广播。

julia> m=rand(3,4)
3×4 Array{Float64,2}:
 0.139323  0.663912  0.994985   0.517332
 0.423913  0.121753  0.0327054  0.0754665
 0.392672  0.47006   0.351121   0.787318

julia> size(m)
(3, 4)

julia> n = rand(3)
3-element Array{Float64,1}:
 0.716752
 0.98755
 0.661226

julia> m .* n
3×4 Array{Float64,2}:
 0.09986   0.475861  0.713157   0.370799
 0.418636  0.120237  0.0322983  0.074527
 0.259645  0.310816  0.23217    0.520595

请注意,n的维度较小,因此第二维的大小为1,因此按列方式应用。广播中的标量处理方式不同,通常内联到融合广播功能中,您无法使用可变类型,因此大小1 =在更高维度上展开广播规则是实现此目的的好方法。