最近稍微学习了一种新的编程语言,感觉做科学计算很好用,似乎比python好用。准备写个小程序算点东西。
具体来说,在不太应该操心变量类型的地方可以完全不管,有许多同名的method会自动匹配。
而在想要限制变量类型的时候又非常方便。(当然对于性能的提升还有待学习)
另外函数的用法也很灵活。(有待学习)
学的时候不禁感慨自己从来没学会过python和C++。
这里会记录我学习的时候觉得重要的东西。
数组
占位
- 有时候定义数组的时候不写入值,与其直接写入某个trivial的值,不如什么都不干只是预留内存的位置。
- 这种时候就可以用
undef
来占位:A=Array{Float64}(undef,2,3)
. - 这时输出数组
A
就是当前分配的内存上的数值:1
2
3
4julia> A=Array{Float64}(undef,2,3)
2×3 Matrix{Float64}:
2.19125e-314 2.19125e-314 2.19125e-314
2.19125e-314 2.19125e-314 2.19125e-314
nothing
可以做什么都没有的占位符。- 可以用函数
isnothing
,notnothing
判断一个值是不是nothing
. - 可以用函数
something
来跳过什么都没有的地方:something(nothing,1)
输出1
- 如果数组中存在缺失的值,这时可以用
missing
占位,帮助定位缺失的值的影响。 missing
会在运算中传播,数学运算中包括missing
就会返回missing
。- 要判断
x
是不是missing
应该使用函数ismissing(x)
,而不是x==missing
,因为missing==missing
会返回missing
.
切片(slice)和视图(view)
- 切片是在内存中制作一个原数组的副本,对其进行操作。
- 视图(view)是数组的一部分,看起来像一个新的数组,但实际上对它的操作会被直接写入底层的数组。
- 效率分析:进行简单的操作的时候,使用视图更高效,因为创建副本消耗更多;进行比较复杂的操作的时候,直接创建副本更高效。
复数
- 使用
im
而不是i或者j。例如1+2im
就是一个复数。 - 构造复数的时候可以用
im
的乘法:a+b*im
. - 但是这样不如complex函数高效:
complex(a,b)
.
函数
- 输入变量可以指定变量类型(就像C),但也可以不指定变量类型(就像Python),因此非常灵活。
- 函数可以直接写成显示表达式,直观。
- 函数可以返回
nothing
等占位用的变量类型。