与其它语言的区别
与 MATLAB 的区别
Julia 的语法和 MATLAB 很像。但 Julia 不是简单地复制 MATLAB ,它们有很多句法和功能上的区别。以下是一些值得注意的区别:
- 数组用方括号来索引,
A[i,j]
- 数组是用引用来赋值的。在
A=B 之后,对 B 赋值也会修改 A
- 使用引用来传递和赋值。如果一个函数修改了数组,调用函数会发现值也变了
- Matlab 把赋值和分配内存合并成了一个语句。比如:
a(4) = 3.2 会创建一个数组 a = [0 0 0 3.2] ,即为a分配了内存并且将每个元素初始化为0,然后为第四个元素赋值3.2,而 a(5) = 7 会为数组a增加长度,并且给第五个元素赋值7。
Julia 把赋值和分配内存分开了:
如果 a 长度为4, a[5] = 7 会抛出一个错误。 Julia 有一个专用的 push! 函数来向 Vectors 里增加元素。并且远比Matlab的 a(end+1) = val 来的高效。
- 虚数单位
sqrt(-1) 用 im 来表示
- 字面上的数字如果没有小数点,则会被默认为整数类型而不是浮点类型。且支持任意长度的整数类型。但是这也意味着一些如
2^-1 的表达式因为不是正式而抛出一个异常。
- Julia 有一维数组。列向量的长度为
N ,而不是 Nx1 。例如, rand(N) 生成的是一维数组
- 使用语法
[x,y,z] 来连接标量或数组,连接发生在第一维度(“垂直”)上。对于第二维度(“水平”)上的连接,需要使用空格,如 [x y z] 。 要想构造块矩阵,尽量使用语法 [a b; c d]
a:b 和 a:b:c 中的冒号,用来构造 Range 对象。使用 linspace 构造一个满向量,或者通过使用方括号来“连接”范围,如 [a:b]
- 函数返回须使用
return 关键字,而不是把它们列在函数定义中
- 一个文件可以包含多个函数,文件被载入时,所有的函数定义都是外部可见的
sum , prod , max 等约简操作,如果被调用时参数只有一个,作用域是数组的所有元素,如 sum(A)
sort 等函数,默认按列方向操作。( sort(A) 等价于 sort(A,1) )。要想排序 1xN 的矩阵,使用 sort(A,2)
- 如果
A 是 2 维数组, fft(A) 计算的是 2 维 FFT. 尤其注意的是, 它不等效于 fft(A,1) , 后者计算的是按列的 1 维 FFT.
- 即使是无参数的函数,也要使用圆括号,如
tic() 和 toc()
- 表达式结尾不要使用分号。表达式的结果不会自动显示(除非在交互式提示符下)。
println 函数可以用来打印值并换行
- 若
A 和 B 是数组, A == B 并不返回布尔值数组。应该使用 A .== B 。其它布尔值运算符可以类比, < , > , != 等
- 符号
& 、| 和 $ 表示位运算“和”、“或”以及“异或”。它们和python中的位运算符有着相同的运算符优先级,和c语言中的位运算符优先级并不一样。
它们能被应用在标量上或者应用在两个数组间(对每个相同位置的元素分别进行逻辑运算,返回一个由结果组成的新数组)。
值得注意的是它们的运算符优先级,别忘了括号:
如果想要判断变量 A 是等于1还是2, 要这样写 (A .== 1) | (A .== 2) 。
- 可以用
... 把集合中的元素作为参数传递给函数,如 xs=[1,2]; f(xs...)
- Julia 中
svd 返回的奇异值是向量而不是完整的对角矩阵
- Julia 中
... 不用来将一行代码拆成多行。Instead, incomplete
expressions automatically continue onto the next line.
- 变量
ans 是交互式会话中执行的最后一条表达式的值;以其它方式执行的表达式的值,不会赋值给它
- Julia 的 type 类型和Matlab中的 classes 非常接近。Matlab 中的 structs 行为介于 Julia 的 types 和 Dicts 之间。如果你想添加一个域在 strut 中,使用 Dict 会比 type 好一些。
与 R 的区别
Julia 也想成为数据分析和统计编程的高效语言。与 R 的区别:
与 Python 的区别
- 对数组、字符串等索引。Julia 索引的下标是从 1 开始,而不是从 0 开始
- 索引列表和数组的最后一个元素时,Julia 使用
end ,Python 使用 -1
- Julia 中的 Comprehensions (还)没有条件 if 语句
- for, if, while, 等块的结尾需要
end ;不强制要求缩进排版
- Julia 没有代码分行的语法:如果在一行的结尾,输入已经是个完整的表达式,就直接执行;否则就继续等待输入。强迫 Julia 的表达式分行的方法是用圆括号括起来
- Julia 总是以列为主序的(类似 Fortran ),而
numpy 数组默认是以行为主序的(类似 C )。如果想优化遍历数组的性能,从 numpy 到 Julia 时应改变遍历的顺序。
|
请发表评论