バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia-backnumber/
はじめに
前回はPython(Numpy)とScilabの基本的な使い方について。
Python(Numpy)は以前から使っている物なので手馴れたもん。
Scilabも記述方法はMATLABと同一。
ただし、コメントアウトの違いに注意。
今回は、同様のことをJuliaでやろうと思っているが、
その前にいろいろクセの違いが・・・。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
Juliaの基本的な使い方・・・の前に。

次はJuliaだね。

Juliaに関しては私も未知の領域だ。
ざっと調べた感じだとMATLABっぽく書いてればOKのように見えるが、
細かい部分でというか、そもそもの考え方の部分で異なってる面もありそうだな。

え?
そうなると結構書き方が変わる?

大きくは変わらないと思ってる。
今回の場合だと・・・。
linspaceが無いから、rangeって関数を使用するのと、
start:step:endのように区間演算子で表現されたものと、数列実態は異なるって点だな。
MATLABとJuliaの区間演算子実態の持ち方の違い

は?
いきなり出てきた「start:step:end」、「区間演算子」って何????

「0:2.5:10」みたいな表現だな。
1から10で、1刻みの等差数列を定義したければ、stepを省略した
「1:10」みたいな書き方になる。

あー、それは良く見るやつだ。
警戒して損した。

その警戒は維持しておいた方が良いかもね。

え゛

MATLABだと
「0:2.5:10」だけで数列になる。
Juliaだと、等差数列という概念にはなっているようだが、実態は持っていないようだな。
MATLABの場合
>> 0:2.5:10
ans =
0 2.5000 5.0000 7.5000 10.0000
>> A(5)=1
A =
0 2.5000 5.0000 7.5000 1.0000
Juliaの場合
> A=range(0,10,length=5)
0.0:2.5:10.0
> A[1]
0.0
> A[5]
10.0
> A[5]=1
ERROR: setindex! not defined for StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}
Stacktrace:
[1] error(::String, ::Type)
@ Base .\error.jl:42
[2] error_if_canonical_setindex(#unused#::IndexLinear, A::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, #unused#::Int64)
@ Base .\abstractarray.jl:1275
[3] setindex!(A::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, v::Int64, I::Int64)
@ Base .\abstractarray.jl:1266
[4] top-level scope
@ REPL[27]:1
区間演算子に実態を持たせるには?

良く分からんけど、
Juliaの等差数列は書き換えができない?

区間演算子の状態だとメモリ上に確保された具体的な実態が無いのだと思う。
よって書き換え先が存在しない。
これを解決するにはVectorを一枚被せれば実態を持つようになって
MATLABと同様な状態になるようだ。
A=Vector(range(0,10,length=5))
5-element Vector{Float64}:
0.0
2.5
5.0
7.5
10.0
julia> A[5]=1
1
julia> A
5-element Vector{Float64}:
0.0
2.5
5.0
7.5
1.0

うーん、なまじMATLABに似ているが故にハマりそうな仕様だなー。
まぁ気を付ければ良いのだろうけど。
まとめ

まとめだよ。
- Juliaの基本的な使い方・・・の前にいろいろクセが違うのでそれの調査。
- start:step:endの形式(区間演算子)で等差数列を表現できるが、この状態ではメモリ上に実態を持っていない。
- よって、読み出しはできるが、書き込みはできない。
- 区間演算子に実態を持たせるにはVectorに渡すことで解決。
バックナンバーはこちら。
コメント