Julia 0.6 から 1.x への移植
整数の直後にドット . と演算子を続けて書かない
例えば、2.+3 のように、整数の直後にドット (ピリオド .)と演算子を置く式は禁止された。 空白を挿入して、次の二つを明示する。
- 整数
2に(配列などを)加算する(+)場合は、整数2の後に空白を置く。 - 浮動小数点数
2.に加算する場合は、+の前に空白を置く。
julia> # 2.+3 # => エラー
2 .+3 # => 整数
5
julia> 2. +3 # => 浮動小数点数
5.0配列とスカラーの加減算は .+, .- を用いる
v0.6.4 では、 配列 v にスカラー a を加減する (v+a または v-a) ことができたが、 v1.x ではできなくなった。 代わりに、v .+ a または v .- a とする。 あるいは、式の前に @. を置いて、@. v+a または @. v-a と書いてもよい。
1次元配列 (ベクトル)の場合
julia> v=[ 1, 2, 3, 4]
4-element Array{Int64,1}:
1
2
3
4
julia> v+1 # エラー
ERROR: MethodError: no method matching +(::Array{Int64,1}, ::Int64)
Closest candidates are:
+(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:502
+(!Matched::Complex{Bool}, ::Real) at complex.jl:292
+(!Matched::Missing, ::Number) at missing.jl:97
...
julia> v.+1
4-element Array{Int64,1}:
2
3
4
5
julia> @. v+1
4-element Array{Int64,1}:
2
3
4
5
julia> v-1 # エラー
ERROR: MethodError: no method matching -(::Array{Int64,1}, ::Int64)
Closest candidates are:
-(!Matched::Complex{Bool}, ::Real) at complex.jl:298
-(!Matched::Missing, ::Number) at missing.jl:97
-(!Matched::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:107
...
julia> v.-1
4-element Array{Int64,1}:
0
1
2
3
julia> @. v-1
4-element Array{Int64,1}:
0
1
2
32次元配列 (行列)の場合
julia> m=[ 1 2; 3 4]
2×2 Array{Int64,2}:
1 2
3 4
julia> m+1 # エラー
ERROR: MethodError: no method matching +(::Array{Int64,2}, ::Int64)
Closest candidates are:
+(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:502
+(!Matched::Complex{Bool}, ::Real) at complex.jl:292
+(!Matched::Missing, ::Number) at missing.jl:97
...
julia> m.+1
2×2 Array{Int64,2}:
2 3
4 5
julia> @. m+1
2×2 Array{Int64,2}:
2 3
4 5
julia> m-1 # エラー
ERROR: MethodError: no method matching -(::Array{Int64,2}, ::Int64)
Closest candidates are:
-(!Matched::Complex{Bool}, ::Real) at complex.jl:298
-(!Matched::Missing, ::Number) at missing.jl:97
-(!Matched::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:107
...
julia> m.-1
2×2 Array{Int64,2}:
0 1
2 3
julia> @. m-1
2×2 Array{Int64,2}:
0 1
2 3配列とスカラーの加減算による更新は .+=, .-= を用いる
v0.6.4 では、 配列 v にスカラー a を加減して更新できた (v+a または v-a) が、 v1.x ではできなくなった。 代わりに、v.+=a または v.=a とする。 あるいは、式の前に @. を置いて、@. v+=a または @. v-=a と書いてもよい。
1次元配列 (ベクトル)の場合
julia> v=[ 1, 2, 3, 4]
4-element Array{Int64,1}:
1
2
3
4
julia> v+=1 # エラー
ERROR: MethodError: no method matching +(::Array{Int64,1}, ::Int64)
Closest candidates are:
+(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:502
+(!Matched::Complex{Bool}, ::Real) at complex.jl:292
+(!Matched::Missing, ::Number) at missing.jl:97
...
julia> v.+=1
4-element Array{Int64,1}:
2
3
4
5
julia> @. v+=1
4-element Array{Int64,1}:
3
4
5
6
julia> v-=1 # エラー
ERROR: MethodError: no method matching -(::Array{Int64,1}, ::Int64)
Closest candidates are:
-(!Matched::Complex{Bool}, ::Real) at complex.jl:298
-(!Matched::Missing, ::Number) at missing.jl:97
-(!Matched::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:107
...
julia> v.-=1
4-element Array{Int64,1}:
2
3
4
5
julia> @. v-=1
4-element Array{Int64,1}:
1
2
3
42次元配列 (行列)の場合
julia> m=[ 1 2; 3 4]
2×2 Array{Int64,2}:
1 2
3 4
julia> m+=1 # エラー
ERROR: MethodError: no method matching +(::Array{Int64,2}, ::Int64)
Closest candidates are:
+(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:502
+(!Matched::Complex{Bool}, ::Real) at complex.jl:292
+(!Matched::Missing, ::Number) at missing.jl:97
...
julia> m.+=1
2×2 Array{Int64,2}:
2 3
4 5
julia> @. m+=1
2×2 Array{Int64,2}:
3 4
5 6
julia> m-=1 # エラー
ERROR: MethodError: no method matching -(::Array{Int64,2}, ::Int64)
Closest candidates are:
-(!Matched::Complex{Bool}, ::Real) at complex.jl:298
-(!Matched::Missing, ::Number) at missing.jl:97
-(!Matched::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:107
...
julia> m.-=1
2×2 Array{Int64,2}:
2 3
4 5
julia> @. m-=1
2×2 Array{Int64,2}:
1 2
3 4なお、配列 v にスカラー a を乗除して更新すること (v*=a または v/=a) は v1.x でも可能である。
julia> v=[ 1, 2, 3, 4]
4-element Array{Int64,1}:
1
2
3
4
julia> v*=2
4-element Array{Int64,1}:
2
4
6
8
julia> v/=2
4-element Array{Float64,1}:
1.0
2.0
3.0
4.0zeros(a) は廃止。zero(a)を用いる
v0.6.4 では、配列 a に対して zeros(a) というメソッドがあったが、廃止された。 v1.x では、代わりに zero(a) を用いる。
このメソッドは、a の要素と同じ要素の型で、a と同じ寸法の配列を作り、 要素の値を全て 0 にする命令である。
julia> a=[1 2; 3 4]
2×2 Array{Int64,2}:
1 2
3 4
julia> zeros(a) # エラー
ERROR: MethodError: no method matching zeros(::Array{Int64,2})
Closest candidates are:
zeros(!Matched::Union{Integer, AbstractUnitRange}...) at array.jl:448
zeros(!Matched::Type{StaticArrays.SArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/SVector.jl:29
zeros(!Matched::Type{StaticArrays.MArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/MVector.jl:27
...
julia> zero(a)
2×2 Array{Int64,2}:
0 0
0 0
julia> a *= 1.0
2×2 Array{Float64,2}:
1.0 2.0
3.0 4.0
julia> zeros(a)
ERROR: MethodError: no method matching zeros(::Array{Float64,2})
Closest candidates are:
zeros(!Matched::Union{Integer, AbstractUnitRange}...) at array.jl:448
zeros(!Matched::Type{StaticArrays.SArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/SVector.jl:29
zeros(!Matched::Type{StaticArrays.MArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/MVector.jl:27
...ones(a) は廃止。one(a)を用いる
v0.6.4 では、配列 a に対して ones(a) というメソッドがあったが、廃止された。 v1.1 では、代わりに one(a) を用いる。
このメソッドは、a の要素と同じ要素の型で、a と同じ寸法の配列を作り、 要素の値を全て 1 にする命令である。
julia> a=[1 2; 3 4]
2×2 Array{Int64,2}:
1 2
3 4
julia> ones(a) # エラー
ERROR: MethodError: no method matching ones(::Array{Int64,2})
Closest candidates are:
ones(!Matched::Union{Integer, AbstractUnitRange}...) at array.jl:448
ones(!Matched::Type{StaticArrays.SArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/SVector.jl:30
ones(!Matched::Type{StaticArrays.MArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/MVector.jl:28
...
julia> one(a)
2×2 Array{Int64,2}:
1 0
0 1
julia> a *= 1.0
2×2 Array{Float64,2}:
1.0 2.0
3.0 4.0
julia> one(a)
2×2 Array{Float64,2}:
1.0 0.0
0.0 1.0realmax(t), realmin(t) は廃止。floatmax(t), floatmin(t) を用いる
v0.6.4 の、型 t に対する関数 realmax(a), realmin は廃止となった。 代わりに、 v0.6.4 の、型 t に対する関数 floatmax(a), floatmin を用いる。
これらは各々、型 t で表される最大の数、最小の数を返す。
bits は廃止。bitstringを用いる。
PyPlot パッケージでは o.m の形式が推奨される
v0.6.4 では、PyPlot パッケージで o[:s] の形で、 オブジェクト o のシンボル s を読むが、推奨されなくなった。 代わりに、o.s の形を使うことが推奨される。
plt[:figure]はplt.figureとする。ax1[:plot]はax1.plotとする。
更に、グラフ描画パッケージ PyPlot.jl が依存する グラフィクス・ライブラリ Matplotlab の呼び出し形式が変更されたために、 修正が必要となる。
アスペクト比 (縦横の寸法の比) を等しくするのに、従来は、 plt[:axes]()[:set_aspect]("equal") と書いていた。 現行は、plt.subplots() 関数を用いて、軸オブジェクト ax を取得してから、 ax.set_aspect("equal") とする。以下の例を見よ、
using PyPlot
fig, ax1 = plt.subplots()
xs=-1:0.1:1
ys=xs.^2;
zs=xs.^3;
ax1.set_aspect("equal")
ax1.plot(xs,ys)
ax1.plot(xs,zs)描画範囲を分割するに従来用いてきた plt.add_subplot() の形式は将来廃止される予定である。 現行では、plt.subfigures() 関数を用いて、描画前に分割する。
using PyPlot
# fig=plt.figure() # v0.6
# fig, axes = plt.subplots(nrows=1,ncols=2) # v0.6, 縦に 1つ、横に 2つ
fig, axes = plt.subplots(1,2)
ax1=axes[1]
ax1.plot([3,2,1])
ax2=axes[2]
ax2.plot([2,3,1])linspace は廃止。range を用いる
v0.6.4 では
linspace(a,b)は、初項a、最終項b, 長さ 50 の等差数列を作る。linspace(a,b,n)は、初項a、最終項b, 長さnの等差数列を作る。
linspace 関数は、v1.x で廃止された。
代わりに、関数 range を用いる。
関数 range は、引数として、初項を必ず指定する必要がある。 関数 range に、2つの数字を引数に指定すると、2つ目の引数は最終項である。 要素の数は、キーワード引数 length で指定する。 最終項目は、キーワード引数 stop で指定することもできる。 さらに、キーワード引数として、数列の長さ length、等差 step を指定できる。 step の既定値は 1 である。
julia> range(1,10) # エラー
┌ Warning: `range(start, stop)` (with neither `length` nor `step` given) is deprecated, use `range(start, stop=stop)` instead.
│ caller = top-level scope at none:0
└ @ Core none:0
1:10
julia> # 初項 1, 最終項 10, 等差 1 (指定しない)
range(1,10,length=10)
1.0:1.0:10.0
julia> # 初項 1, 最終項 10, 等差 2
range(1,10,step=2)
1:2:9
julia> collect(ans)
5-element Array{Int64,1}:
1
3
5
7
9なお、 最終項 stopと長さ length が指定され、等差 step が指定されない場合には、step は、計算される。 したがって、v0.6.4 の linspace(-1,1) に対応する、 もう一つの書き方は range(-1,1,length=50) である。
julia> r1=LinRange(-1,1,50)
50-element LinRange{Float64}:
-1.0,-0.959184,-0.918367,-0.877551,-0.836735,…,0.877551,0.918367,0.959184,1.0
julia> r2=range(-1,1,length=50)
-1.0:0.04081632653061224:1.0両者は計算方法が異なるので、数値は微妙に異なる。
julia> r1=collect(r1)
50-element Array{Float64,1}:
-1.0
-0.9591836734693877
-0.9183673469387754
-0.8775510204081634
-0.8367346938775511
-0.7959183673469388
-0.7551020408163265
-0.7142857142857144
-0.6734693877551021
-0.6326530612244898
⋮
0.6734693877551021
0.7142857142857142
0.7551020408163265
0.7959183673469388
0.8367346938775511
0.8775510204081634
0.9183673469387754
0.9591836734693877
1.0
julia> r2=collect(r2)
50-element Array{Float64,1}:
-1.0
-0.9591836734693877
-0.9183673469387755
-0.8775510204081632
-0.8367346938775511
-0.7959183673469388
-0.7551020408163265
-0.7142857142857143
-0.673469387755102
-0.6326530612244898
⋮
0.673469387755102
0.7142857142857143
0.7551020408163265
0.7959183673469388
0.8367346938775511
0.8775510204081632
0.9183673469387755
0.9591836734693877
1.0
julia> r1 .== r2 # 全て true ではない
50-element BitArray{1}:
true
true
false
false
true
true
true
false
false
true
⋮
false
false
true
true
true
false
false
true
true
julia> abs.(r1 .- r2) # 残余
50-element Array{Float64,1}:
0.0
0.0
1.1102230246251565e-16
1.1102230246251565e-16
0.0
0.0
0.0
1.1102230246251565e-16
1.1102230246251565e-16
0.0
⋮
1.1102230246251565e-16
1.1102230246251565e-16
0.0
0.0
0.0
1.1102230246251565e-16
1.1102230246251565e-16
0.0
0.0
julia> isapprox.(r1,r2) # 全て true となる
50-element BitArray{1}:
true
true
true
true
true
true
true
true
true
true
⋮
true
true
true
true
true
true
true
true
truelogspaceは廃止。exp10.(range(a,b)) などを用いる
v0.6.4で、$10$ のべき乗で等比数列を作る logspace は、v1.x で廃止された。 代わりに、exp10.(range(a,b,length=n)) などを用いる。
julia> logspace(-2,2,5) # エラー
ERROR: UndefVarError: logspace not defined
julia> exp10.(LinRange(-2,2,5)) # LinRange を用いる
5-element Array{Float64,1}:
0.01
0.1
1.0
10.0
100.0
julia> exp10.(range(-2,stop=2,length=5)) # range を用いる
5-element Array{Float64,1}:
0.01
0.1
1.0
10.0
100.0srand(n) は廃止。Random.seed!(n) を用いる
v0.6.4 では、関数 srand(m) を用いて、 乱数の種をリセットしたが、v1.x では廃止された。
代わりに、Random パッケージを using してから Random.seed!(n) を用いる。
julia> srand(1234) # エラー
ERROR: UndefVarError: srand not defined
julia> using Random # Random パッケージを読み込む
julia> Random.seed!(1234)
Random.MersenneTwister(UInt32[0x000004d2], Random.DSFMT.DSFMT_state(Int32[-1393240018, 1073611148, 45497681, 1072875908, 436273599, 1073674613, -2043716458, 1073445557, -254908435, 1072827086 … -599655111, 1073144102, 367655457, 1072985259, -1278750689, 1018350124, -597141475, 249849711, 382, 0]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], UInt128[0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000 … 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000], 1002, 0)