Julia 的语法和 MATLAB 很像。但 Julia 不是简单地复制 MATLAB ,它们有很多句法和功能上的区别。以下是一些值得注意的区别:
A[i,j]A=B之后,对 B赋值也会修改 Aa(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的表达式因为不是正式而抛出一个异常。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...)svd返回的奇异值是向量而不是完整的对角矩阵...不用来将一行代码拆成多行。Instead, incomplete expressions automatically continue onto the next line.ans是交互式会话中执行的最后一条表达式的值;以其它方式执行的表达式的值,不会赋值给它Julia 也想成为数据分析和统计编程的高效语言。与 R 的区别:
=赋值,不提供 <-或 <<-等箭头式运算符[1, 2, 3]等价于 R 中的 c(1, 2, 3)A和 B是矩阵,那么矩阵乘法在 Julia 中为 A * B, R 中为 A %*% B。在 R 中,第一个语句表示的是逐元素的 Hadamard 乘法。要进行逐元素点乘,Julia 中为 A .* B'运算符做矩阵转置。 Julia 中 A'等价于 R 中 t(A)if语句或 for循环时不需要写圆括号:应写 for i in [1, 2, 3]而不是 for (i in c(1, 2, 3));应写 if i == 1而不是 if (i == 1)0和 1不是布尔值。不能写 if (1),因为 if语句仅接受布尔值作为参数。应写成 if truenrow和 ncol。应该使用 size(M, 1)替代 nrow(M);使用 size(M, 2)替代 ncol(M)X调用 svd(X, true)1和 c(1)是一样的。在 Julia 中,它们完全不同。例如若 x和 y为向量,则 x' * y是一个单元素向量,而不是标量。要得到标量,应使用 dot(x, y)diag()和 diagm()与 R 中的不同diag(M) = ones(n)Julia 不赞成把 main 命名空间塞满函数。大多数统计学函数可以在 扩展包中找到,比如 DataFrames 和 Distributions 包:
list(a = 1, b = 2),应该使用 (1, 2)table(x::TypeA)和 table(x::TypeB)等价于 R 中的 table.TypeA(x)和 table.TypeB(x)hcat和 vcat来连接向量和矩阵,而不是 c, rbind和 cbinda:b与 R 中的定义向量的符号不同。它是一个特殊的对象,用于低内存开销的迭代。要把范围对象转换为向量,应该用方括号把范围对象括起来 [a:b]max和min等价于 R 语言中的pmax和pmin。但是所有的参数都应该有相同的维度。而且 maximum, minimum可以替代 R 语言的 maxand min,这是最大的区别。sum, prod, maximum, minimum和 R 语言中的同名函数并不相同。它们接收一个或者两个参数。第一个参数是集合,例如一个 array,如果有第二个参数,这个参数可以指明数据的维度,除此之外操作相似。比如,让 Julia 中的 A=[[1 2],[3,4]]和 R 中的 B=rbind(c(1,2),c(3,4))比较会是一个矩阵。 接着 sum(A)和sum(B)会有相同的结果, 但是 sum(A,1)是一个包含一列和的行向量,而 sum(A,2)是一个包含行和的列向量. 如果第二个参数是向量,如 sum(A,[1,2])=10, 需要确保第二参数没有问题。sort(v)和 sort!(v)函数中,带感叹号的可以修改 vcolMeans()和 rowMeans(), size(m, 1)和 size(m, 2)NULL类型assign或 get所等价的语句end,Python 使用 -1end;不强制要求缩进排版numpy数组默认是以行为主序的(类似 C )。如果想优化遍历数组的性能,从 numpy到 Julia 时应改变遍历的顺序。