查看原文
其他

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

JunJunLab 老俊俊的生信笔记 2022-08-17

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

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(123234)
145

julia> nand(123123)
-124

julia> 123 ⊼ 123
-124

julia> nor(123124)
-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(NaNNaN)
true

julia> isequal([1 NaN], [1 NaN])
true

julia> isequal(NaNNaN32)
true

isequal 也能用来区分带符号的零:

julia> -0.0 == 0.0
true

julia> isequal(-0.00.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 类型。
  1. T 如果 T 是浮点类型,转换的结果就是最近的可表示值, 可能会是正负无穷大。
  2. 如果 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,


    老俊俊微信:


    知识星球:



    今天的分享就到这里了,敬请期待下一篇!

    最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

    如果觉得对您帮助很大,赏杯快乐水喝喝吧!



      





    XAM 包处理 sam 和 bam 文件

    Nature 文章主图结果复现

    windows 也能快速处理 BAM/SAM 大型文件

    Julia 笔记之变量-整数-浮点数

    cell 代码优化测试复现二 (终)

    cell 代码优化测试复现一

    R 语言绘制二维密度相关性散点图

    Julia 的下载安装及配置

    使用 python 进行 Ribo-seq 质控分析 二

    deeptools 结果重新绘图

    ◀...

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存