MATLAB,Python,Scilab,Julia比較 その13【基本的な使い方③】

MATLAB,Python,Scilab,Julia比較 その13【基本的な使い方③】 数値計算
MATLAB,Python,Scilab,Julia比較 その13【基本的な使い方③】

バックナンバーはこちら。
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に渡すことで解決。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました