Julia 笔记之数学运算和初等函数

没关注?伸出手指点这里—


1引言
今天分享一下 Julia 中的数学运算和初等函数。Julia 为它所有的基础数值类型,提供了整套的基础算术和位运算,也提供了一套高效、可移植的标准数学函数。
本文内容摘抄自 Julia 中文文档。
2算术运算符

除了优先级比二元操作符高以外,直接放在标识符或括号前的数字
,如 2x 或 2(x+y) 还会被视为乘法
。
符号 ÷ 可以通过输入 div<tab>
到 REPL 或 Julia IDE 的方式来打出。
julia> 1 + 2 + 3
6
julia> 1 - 2
-1
julia> 3*2/12
0.5
在乘法操作中,false 被视作零:
julia> NaN * false
0.0
julia> false * Inf
0.0
3布尔运算符

4位运算符

例子:
julia> ~123
-124
julia> 123 & 234
106
julia> 123 | 234
251
julia> 123 ⊻ 234
145
julia> xor(123, 234)
145
julia> nand(123, 123)
-124
julia> 123 ⊼ 123
-124
julia> nor(123, 124)
-128
julia> 123 ⊽ 124
-128
julia> ~UInt32(123)
0xffffff84
julia> ~UInt8(123)
0x84
5复合赋值运算符
每一个二元运算符和位运算符都可以给左操作数复合赋值:方法是把 = 直接放在二元运算符后面。比如,x += 3 等价于 x = x + 3:
julia> x = 1
1
julia> x += 3
4
julia> x
4
二元运算符和位运算符的复合赋值操作符有下面几种:
+= -= *= /= = ÷= %= ^= &= |= ⊻= >>>= >>= <<=
6向量化 “点” 运算符
Julia 中,每个二元运算符都有一个 “点” 运算符与之对应,例如 ^ 就有对应的 .^ 存在。这个对应的 .^ 被 Julia 自动地定义为逐元素地执行 ^ 运算。比如 [1,2,3] ^ 3 是非法的,因为数学上没有给(长宽不一样的)数组的立方下过定义。但是 [1,2,3] .^ 3 在 Julia 里是合法的,它会逐元素地执行 ^ 运算(或称向量化运算),得到 [1^3, 2^3, 3^3]。类似地,! 或 √ 这样的一元运算符,也都有一个对应的 .√ 用于执行逐元素运算:
julia> [1,2,3] .^ 3
3-element Vector{Int64}:
1
8
27
除了点运算符,我们还有逐点赋值运算符,类似 a .+= b(或者 @. a += b)会被解析成 a .= a .+ b,这里的 .= 是一个融合的 in-place 运算。
7数值比较
标准的比较操作对所有原始数值类型有定义:

例子:
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
+0 等于但不大于 -0。 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 给这些特别的数提供了下面几个额外的测试函数。这些函数在某些情况下很有用处,比如在做 hash 比较时:

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
8链式比较
与其他多数语言不同,就像 notable exception of Python 一样,Julia 允许链式比较:
julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true
链式比较在写数值代码时特别方便,它使用 && 运算符比较标量,数组则用 & 进行按元素比较。比如,0 .< A .< 1 会得到一个 boolean 数组,如果 A 的元素都在 0 和 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) 是计算了两次的。然而,链式比较中的顺序是不确定的。强烈建议不要在表达式中使用有副作用(比如 printing)的函数。如果的确需要,请使用短路运算符 &&。
9数值转换
Julia 支持三种数值转换,它们在处理不精确转换上有所不同。
T(x) 和 convert(T,x) 都会把 x 转换为 T 类型。
T 如果 T 是浮点类型,转换的结果就是最近的可表示值, 可能会是正负无穷大。 如果 T 为整数类型,当 x 不能由 T 类型表示时,会抛出 InexactError。 x % T 将整数 x 转换为整型 T,与 x 模 2^n 的结果一致,其中 n 是 T 的位数。换句话说,在二进制表示下被截掉了一部分。 T 舍入函数 接收一个 T 类型的可选参数。比如,round(Int,x) 是 Int(round(x)) 的简写版。
10舍入函数

11除法函数

12符号和绝对值函数

13幂、对数与平方根

14三角和双曲函数
所有标准的三角和双曲函数也都已经定义了:
sin cos tan cot sec csc
sinh cosh tanh coth sech csch
asin acos atan acot asec acsc
asinh acosh atanh acoth asech acsch
sinc cosc
所有这些函数都是单参数函数,不过 atan 也可以接收两个参数 来表示传统的 atan2 函数。
另外,sinpi(x) 和 cospi(x) 分别用来对 sin(pix) 和 cos(pix) 进行更精确的计算。
要计算角度而非弧度的三角函数,以 d 做后缀。比如,sind(x) 计算 x 的 sine 值,其中 x 是一个角度值。下面是角度变量的三角函数完整列表:
sind cosd tand cotd secd cscd
asind acosd atand acotd asecd acscd
15特殊函数
SpecialFunctions.jl
提供了许多其他的特殊数学函数。

欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群
哦,数据代码已上传至QQ群,欢迎加入下载。
群二维码:
老俊俊微信:
知识星球:
所以今天你学习了吗?
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,赏杯快乐水喝喝吧!
往期回顾
◀...
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!