Julia 中的 (x:y) 运算符
(x:y) operator in Julia
我正在尝试理解这段代码:
r = (1:10) - (4/1)
println(r)
Output:
-3.0:1.0:6.0
我明白了为什么我得到了 -3
和 6
。但是为什么我在中间 (1.0) 得到那个值?朱莉娅是如何计算的?或者我怎样才能google呢?
(first:step:last)
语法在 Julia
中表示一个 Range
类型
typeof(1:10) # => UnitRange{Int32}
如果省略step部分,默认为1
1:10 == 1:1:10 # => true
一个Range
是一个系列的紧凑视图
collect(1:10) # => 10-element Array{Int32,1}:
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
因此,预计 Range
类型和 Vector
遵循相同的规则,例如,当您添加这样的常量值时:
collect(1+(1:10))==collect(1:10)+1 # => true
甚至添加两个向量也会得到与添加它们的范围表示相同的结果,如下所示:
collect((1:10)+(1:10))==collect(1:10)+collect(1:10) # => true
4/1
returns中的除法运算符Float64
。虽然原来的Range是一个大小为1 Int
步长的Range,但是在两边加上一个浮点数之后就变成了一个Float64
的Range。因此,1.0 的步长是通过转换隐式整数步长创建的(浮点数是非均匀分布的,因此均匀步进有点棘手 - 有时会出现舍入问题)。
将 float
应用于间隔时可以看到:
julia> 1:10
1:10
julia> float(1:10)
1.0:1.0:10.0
并且在添加到 Float64 之前需要进行此提升 4/1
(4.0
)。
类似地,将整数添加到浮点数时 julia "promotes" 将整数添加到浮点数之前 adding/subtracting:
julia> 1 + 2.0
3.0
julia> @which 1 + 2.0
+(x::Number, y::Number) at promotion.jl:172
+(x::Number, y::Number) = +(promote(x,y)...)
您可以 @which
一直跟踪函数调用以了解发生了什么(一直到 the following):
julia> @which +(1:10, 2.0)
+(A::AbstractArray{T,N}, x::Number) at arraymath.jl
julia> @which .+(1:10, 2.0)
.+(r::Range{T}, x::Real) at range.jl
julia> @which .+(2.0, 1:10)
.+(x::Real, r::UnitRange{T<:Real}) at range.jl
# which is defined as
.+(x::Real, r::UnitRange) = range(x + r.start, length(r))
因此 Int64 和 Float64 的提升加法。
注意在master中显示的区间略少confusing/ambiguous:
julia> float(1:10)
10-element FloatRange{Float64}:
1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0
julia> 1:10
10-element UnitRange{Int64}:
1,2,3,4,5,6,7,8,9,10
我正在尝试理解这段代码:
r = (1:10) - (4/1)
println(r)
Output:
-3.0:1.0:6.0
我明白了为什么我得到了 -3
和 6
。但是为什么我在中间 (1.0) 得到那个值?朱莉娅是如何计算的?或者我怎样才能google呢?
(first:step:last)
语法在 Julia
Range
类型
typeof(1:10) # => UnitRange{Int32}
如果省略step部分,默认为1
1:10 == 1:1:10 # => true
一个Range
是一个系列的紧凑视图
collect(1:10) # => 10-element Array{Int32,1}:
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
因此,预计 Range
类型和 Vector
遵循相同的规则,例如,当您添加这样的常量值时:
collect(1+(1:10))==collect(1:10)+1 # => true
甚至添加两个向量也会得到与添加它们的范围表示相同的结果,如下所示:
collect((1:10)+(1:10))==collect(1:10)+collect(1:10) # => true
4/1
returns中的除法运算符Float64
。虽然原来的Range是一个大小为1 Int
步长的Range,但是在两边加上一个浮点数之后就变成了一个Float64
的Range。因此,1.0 的步长是通过转换隐式整数步长创建的(浮点数是非均匀分布的,因此均匀步进有点棘手 - 有时会出现舍入问题)。
将 float
应用于间隔时可以看到:
julia> 1:10
1:10
julia> float(1:10)
1.0:1.0:10.0
并且在添加到 Float64 之前需要进行此提升 4/1
(4.0
)。
类似地,将整数添加到浮点数时 julia "promotes" 将整数添加到浮点数之前 adding/subtracting:
julia> 1 + 2.0
3.0
julia> @which 1 + 2.0
+(x::Number, y::Number) at promotion.jl:172
+(x::Number, y::Number) = +(promote(x,y)...)
您可以 @which
一直跟踪函数调用以了解发生了什么(一直到 the following):
julia> @which +(1:10, 2.0)
+(A::AbstractArray{T,N}, x::Number) at arraymath.jl
julia> @which .+(1:10, 2.0)
.+(r::Range{T}, x::Real) at range.jl
julia> @which .+(2.0, 1:10)
.+(x::Real, r::UnitRange{T<:Real}) at range.jl
# which is defined as
.+(x::Real, r::UnitRange) = range(x + r.start, length(r))
因此 Int64 和 Float64 的提升加法。
注意在master中显示的区间略少confusing/ambiguous:
julia> float(1:10)
10-element FloatRange{Float64}:
1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0
julia> 1:10
10-element UnitRange{Int64}:
1,2,3,4,5,6,7,8,9,10