欢迎关注Julia语言微信公众账号 julia_language
原文链接:http://suo.im/57CnEx
微信公众号:Julia语言
每周一三五更新Julia语言;
每周二四六更新Python进阶;
矢量化的点运算符
对于像这样的运算符,都有一个相应的“点”运算。自动定义为在数组上逐个元素执行。 例如,[1,2,3] ^ 3
没有定义,因为“三次方”数组没有标准的数学意义,但是[1,2,3].^ 3
被定义为计算 元素(或“矢量化”)结果[1 ^ 3,2 ^ 3,3 ^ 3]
。 同样对于一元运算符来说√
,有一个相应的点运算符.√
适用于列表中的各个元素。
julia> [1,2,3] .^ 3
3-element Array{Int64,1}:
1
8
27
julia> .√[1,81,49,101]
4-element Array{Float64,1}:
1.0
9.0
7.0
10.04987562112089
点语法也可以应用于自定义算子。例如,定义了一个Kronecker积(A ⊗ B), ⊗(A,B) = kron(A,B)
,那么[A,B] .⊗ [C,D]就会被解析为[A⊗C, B⊗D],无需额外的代码。
下面的语法是不被允许的,因为有歧义。
1.+x
可以理解为以下两种情况:
1. + x
1 .+ x
√怎么打?
左手按住换档键([Alt键]不放,右手依次按41420(不要按键盘上方的,要按右边的),松开双手,根号(√)就出来了
数值比较
所有的基础数值类型都可以使用比较运算符:
数值比较运算符.png
julia> 1 == 1
true
julia> 1 == 2
false
julia> 1 != 2
true
julia> 1 == 1.0
true
julia> 1 < 2
true
julia> 1.0 > 3
false
julia> 1 >= 1.0
true
julia> -1 <= 1
true
julia> -1 <= -1
true
julia> -1 <= -2
false
julia> 3 < -0.5
false
整数是按位比较的。浮点数是 IEEE 754 标准 比较的:
- 有限数按照正常方式做比较。
- 正数的零等于但不大于负数的零。
-
Inf
等于它本身,并且大于所有数, 除了NaN
。 -
-Inf
等于它本身,并且小于所有数, 除了NaN
。 -
NaN
不等于、不大于、不小于任何数,包括它本身。
上面最后一条是关于 NaN
的性质,值得留意:
julia> NaN == NaN
false
julia> NaN != NaN
true
julia> NaN < NaN
false
julia> NaN > NaN
false
NaN
在矩阵中使用时会带来些麻烦:
julia> [1 NaN] == [1 NaN]
false
Julia 提供了附加函数, 用以测试这些特殊值,它们使用哈希值来比较:
functions to test numbers for special values.png
isequal
函数,认为 NaN
等于它本身:
julia> isequal(NaN, NaN)
true
julia> isequal([1 NaN], [1 NaN])
true
julia> isequal(NaN, NaN32)
true
isequal
也可以用来区分有符号的零:
julia> -0.0 == 0.0
true
julia> isequal(-0.0, 0.0)
false
有符号整数,无符号整数和浮点数之间的混合类型比较可能很棘手。 我们已经采取了很多措施来确保Julia正确地做到这一点。
对于其他类型,isequal
默认调用==
,因此如果要为自己的类型定义相等性,则只需添加==
方法。 如果定义自己的相等函数,则应该定义相应的哈希方法,以确保isequal(x, y)
表示hash(x)== hash(y)
。
链式比较
与大多数语言不同,Julia 支持 Python链式比较 :
julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true
备注
效果上等同于(1 < 2) && (2 <= 2) && (2 < 3) && (3 == 3) && (3 > 2) && (2 >= 1) && (1 == 1) && (1 < 3) && (3 != 5)
对标量的比较,链式比较使用 &&
运算符;对逐元素的比较使用 &
运算符,此运算符也可用于数组。例如,0 .< A .< 1
的结果是一个对应的布尔数组,满足条件的元素返回 true
。
注意链式比较的比较顺序:
julia> v(x) = (println(x); x)
v (generic function with 1 method)
julia> v(1) < v(2) <= v(3)
2
1
3
true
julia> v(1) > v(2) <= v(3)
2
1
false
中间的值只计算了一次,而不是像 v(1) < v(2) && v(2) <= v(3)
一样计算了两次。但是,链式比较的计算顺序是不确定的。不要在链式比较中使用带副作用(比如打印)的表达式。如果需要使用副作用表达式,推荐使用短路&&
运算符。
备注
v(1) < v(2) <= v(3)
效果上等同于v(1) < v(2) && v(2) <= v(3)
,具体的计算步骤为:
- 执行
v(2)
,输出2 - 执行
v(1)
,输出1 - 比较
v(1) < v(2)
,为true
- 执行
v(3)
,输出3 - 比较
v(2) <= v(3)
,为true
- 最后
true && true
,结果为true
同理v(1) > v(2) <= v(3))
效果上等同于v(1) > v(2) && v(2) <= v(3)
,具体的计算步骤为:
- 执行
v(2)
,输出2 - 执行
v(1)
,输出1 - 比较
v(1) > v(2)
,为false
- 现在原式就等同于
false && v(2) <= v(3)
,因为已经有了一个false
,且是&&
运算符,无需再比较后面的,结果就为false
初等函数
Julia提供全面的数学函数和运算符集合。 这些数学运算在广义的一类数值上定义为允许合理的定义,包括整数,浮点数,有理数和复数,只要这些定义有意义。
此外,这些函数可以以“矢量化”的方式应用于具有点语法f.(A)
的数组和其他集合,例如, sin.(A)
将计算数组A的每个元素的正弦值。
运算优先级和结合性
Julia 运算优先级从高至低依次为:
运算优先级和结合性.png
一元运算符+
和-
需要围绕其参数的显式括号来消除它们与运算符++
等的歧义。一元运算符的其他组合被解析为具有右关联性,例如。 例如,√√-a
为√(√(-a))
。
运算符+
,++
和*
是非关联的。 a + b + c
被解析为+(a, b, c)
而不是+(+(a, b), c)
。 但是,+(a, b, c, d ...)
和*(a, b, c, d...)
的回退方法都默认为左关联。
有关每个Julia运算符优先级的完整列表,请参阅此文件src / julia-parser.scm
您还可以通过内置函数Base.operator_precedence
找到任何给定运算符的数字优先级,其中较高的数字优先:
julia> Base.operator_precedence(:+), Base.operator_precedence(:*), Base.operator_precedence(:.)
(11, 13, 17)
julia> Base.operator_precedence(:sin), Base.operator_precedence(:+=), Base.operator_precedence(:(=)) # (Note the necessary parens on `:(=)`)
(0, 1, 1)
通过调用内置函数Base.operator_associativity
,也可以找到表示运算符关联性的符号:
julia> Base.operator_associativity(:-), Base.operator_associativity(:+), Base.operator_associativity(:^)
(:left, :none, :right)
julia> Base.operator_associativity(:⊗), Base.operator_associativity(:sin), Base.operator_associativity(:→)
(:left, :none, :right)
请注意,符号如:sin
返回优先级0
.此值表示无效运算符,而不是最低优先级的运算符。 类似地,这些运算符被赋予关联性:none
。
点击阅读原文可查看历史文章
网友评论