LoginSignup
3
4

More than 1 year has passed since last update.

Julia早引きノート[18]多次元配列 (2)様々な演算や関数

Last updated at Posted at 2020-12-04

多次元配列 (2)様々な演算や関数 (書き方例)

note18
◆多次元配列の演算
 ▼四則演算
  # AとBの加算
  A + B
  # AとBの積
  A * B
  # Aの定数倍(cは定数またはスカラー値)
  c * A
  # AとBの右除算(右からBの逆行列を掛ける)
  A / B
  # AとBの左除算(左からAの逆行列を掛ける)
  A \ B

 ▼ドット演算
  # AとBの要素ごとの加算
  A .+ B
  # Aとcの加算
  A .+ c 
  # AとBの要素ごとの減算
  A .- B
  # Aとcの減算
  A .- c
  # AとBの要素ごとの掛算
  A .* B
  # Aとcの掛算
  A .* c
  # AとBの要素ごとの割算
  A ./ B
  # Aとcの割算
  A ./ c


◆様々な関数(情報の取得)
 # Aの要素の型
 eltype(A)
 # Aの要素の数
 length(A)
 # Aの次元数
 ndims(A)
 # Aのサイズ
 size(A)
 # n番目の次元のAのサイズ
 size(A,n)
 # Aのストライド
 strides(A)
 # n番目の次元のAのストライド
 stride(A,n)


◆ブロードキャスティング(型が異なる配列同士の演算)
 broadcast(f, args...)
 # 加算の例
 broadcast(+, A, C)


◆変換(map)、集約(reduce)、フィルタリング(filter)、その他の演算
 ▼変換(map)
  map(f, A)
  # 各要素を2乗する例
  map(x -> x^2, A)

 ▼集約(reduce)
  reduce(f, A)
  # 配列Aの要素を集約(加算)
  reduce(+, A)

 ▼フィルタリング(filter)
  filter(f, A)
  # 0.5以上の要素を抽出(フィルタリング)
  filter(x -> x >= 0.5, A)

 ▼その他の演算
  # 要素の最大値
  maximum(A)
  # 要素の最小値
  minimum(A)
  # 要素の和
  sum(A)
  # 要素の最大値のインデックス番号
  argmax(A)
  # 要素の最小値のインデックス番号
  argmin(A)

解説

多次元配列には以下のような機能があります。
 ①多次元配列の演算
 ②様々な関数(情報の取得)
 ③ブロードキャスティング(異なる配列同士の演算)
 ④変換(map)、集約(reduce)、フィルタリング(filter)、その他の演算

①多次元配列の演算

解説を見る

多次元配列の基本的な四則演算とドット演算について説明します。

:large_orange_diamond: 基本的な四則演算
以下に四則演算をまとめます。

No 内容
(1) A + B AとBの加算
(2) A - B AとBの減算
(3) A * B AとBの積
(4) c * A Aの定数倍
(5) A / B AとBの右除算
(6) A \ B AとBの左除算

以下の解説で、A,Bは次のような2x2次元配列とします。

A = \begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix}, 
B = \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix}

(1)A + B(AとBの加算)

A + B = \begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix} + \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix} = \begin{pmatrix} 1 & 3 \\ 3 & 3 \end{pmatrix}

実行結果
image.png

(2)A - B(AとBの減算)

A - B = \begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix} - \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix} = \begin{pmatrix} 1 & 1 \\ -1 & 3 \end{pmatrix}

実行結果
image.png

(3)A * B(AとBの積)

A * B = \begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix}  \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix} = \begin{pmatrix} 4 & 1 \\ 6 & 1 \end{pmatrix}

実行結果
image.png

(4)c * A(Aの定数倍)
Aの各要素を定数倍(スカラー倍)します。

c * A = \begin{pmatrix} c × 1 & c × 2 \\ c × 1 & c × 3 \end{pmatrix}\\
例:c = 2とすると、\\
2 * A = \begin{pmatrix} 2 & 4 \\ 2 & 6 \end{pmatrix}

実行結果
image.png

(5)A / B(AとBの右除算)
行列演算には割り算(除算)はありませんが、逆行列を用いることで割り算と同じような演算を行います。
$A$に対する$B$の右除算とは、$A$に対して右から$B$の逆行列をかけることで、$B$で割ったように計算することです。

B^{-1}=\frac{1}{2}\begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix}を用いて\\
A * B^{-1} = \begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix} \frac{1}{2}\begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix}\\ = \frac{1}{2}\begin{pmatrix} 4 & 1 \\ 6 & 1\end{pmatrix}\\ = \begin{pmatrix} 2 & 0.5 \\ 3 & 0.5 \end{pmatrix}

実行結果
image.png

(6)A \ B(AとBの左除算)
右除算と同様に逆行列を用います。
$B$に対する$A$の左除算とは、$B$に対して左から$A$の逆行列をかけることで、$A$で割ったように計算することです。

A^{-1}=\begin{pmatrix} 3 & -2 \\ -1 & 1 \end{pmatrix}を用いて\\
A^{-1} * B = \begin{pmatrix} 3 & -2 \\ -1 & 1 \end{pmatrix} \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix}\\ = \begin{pmatrix} -4 & 3 \\ 2 & -1\end{pmatrix}

実行結果
image.png

:large_blue_diamond: ドット演算
以下にドット演算をまとめます。cは定数(スカラー)です。

No 内容
(7) A .+ B AとBの要素ごとの加算
(8) A .+ c Aとcの加算
(9) A .- B AとBの要素ごとの減算
(10) A .- c Aとcの減算
(11) A .* B AとBの要素ごとの掛算
(12) A .* c Aとcの掛算
(13) A ./ B AとBの要素ごとの割算
(14) A ./ c Aとcの割算

(7)A .+ B(AとBの要素ごとの加算)

A.+B = \begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix} + \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix}\\= \begin{pmatrix} 1+0 & 2+1 \\ 1+2 & 3+0 \end{pmatrix}\\
 = \begin{pmatrix} 1 & 3 \\ 3 & 3 \end{pmatrix}

実行結果
image.png

(8)A .+ c(Aとcの加算)
cは定数(スカラー)とします。

A.+c = \begin{pmatrix} 1+c & 2+c \\ 1+c & 3+c \end{pmatrix}\\
c=2とすると、\\
=\begin{pmatrix} 1+2 & 2+2 \\ 1+2 & 3+2 \end{pmatrix}\\
= \begin{pmatrix} 3 & 4 \\ 3 & 5 \end{pmatrix}

実行結果
image.png

(9)A .- B(AとBの要素ごとの減算)

A.-B = \begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix} - \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix}\\= \begin{pmatrix} 1-0 & 2-1 \\ 1-2 & 3-0 \end{pmatrix}\\
 = \begin{pmatrix} 1 & 1 \\ -1 & 3 \end{pmatrix}

実行結果
image.png

(10)A .- c(Aとcの減算)
cは定数(スカラー)とします。

A.-c = \begin{pmatrix} 1-c & 2-c \\ 1-c & 3-c \end{pmatrix}\\
c=2とすると、\\
=\begin{pmatrix} 1-2 & 2-2 \\ 1-2 & 3-2 \end{pmatrix}\\
= \begin{pmatrix} -1 & 0 \\ -1 & 1 \end{pmatrix}

実行結果
image.png

(11)A .* B(AとBの要素ごとの掛算)

A.*B=\begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix} .* \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix}\\= \begin{pmatrix} 1×0 & 2×1 \\ 1×2 & 3×0 \end{pmatrix}\\= \begin{pmatrix} 0 & 2 \\ 2 & 0 \end{pmatrix}

実行結果
image.png

(12)A .* c(Aとcの掛算)
cは定数(スカラー)とします。

A.*c=\begin{pmatrix} 1×c & 2×c \\ 1×c & 3×c \end{pmatrix}\\
c=2とすると、\\
= \begin{pmatrix} 1×2 & 2×2 \\ 1×2 & 3×2 \end{pmatrix}\\
= \begin{pmatrix} 2 & 4 \\ 2 & 6 \end{pmatrix}

実行結果
image.png

(13)A ./ B(AとBの要素ごとの割算)

A./B=\begin{pmatrix} 1 & 2 \\ 1 & 3 \end{pmatrix} ./ \begin{pmatrix} 0 & 1 \\ 2 & 0 \end{pmatrix}\\= \begin{pmatrix} 1÷0 & 2÷1 \\ 1÷2 & 3÷0 \end{pmatrix}\\= \begin{pmatrix} * & 2 \\ 0.5 & * \end{pmatrix}\\
*は0除算のため値無し

実行結果
※0除算項はInf(無限大)となっています。
image.png

(14)A .* c(Aとcの割算)
cは定数(スカラー)とします。

A./c=\begin{pmatrix} 1÷c & 2÷c \\ 1÷c & 3÷c \end{pmatrix}\\
c=2とすると、\\
= \begin{pmatrix} 1÷2 & 2÷2 \\ 1÷2 & 3÷2 \end{pmatrix}\\
= \begin{pmatrix} 0.5 & 1 \\ 0.5 & 1.5 \end{pmatrix}

実行結果
image.png

②様々な関数(情報の取得)

解説を見る

主要な関数を以下にまとめました。
Aを多次元配列とします。

No 関数 内容
(1) eltype(A) Aの要素の型
(2) length(A) Aの要素の数
(3) ndims(A) Aの次元数
(4) size(A) Aのサイズ
(5) size(A,n) n番目の次元のAのサイズ
(6) strides(A) Aのストライド
(7) stride(A,n) n番目の次元のAのストライド

(1) eltype(A)
Aの要素の型を取得します。
image.png

(2) length(A)
Aの要素数を取得します。
下例では、3次元配列で各次元の要素が2個、3個、3個なので、全要素数は18個となります。
image.png

(3) ndims(A)
次元数を取得します。
image.png

(4) size(A)
サイズ(次元ごとの要素数)を取得します。
1次元目の要素は2個、2次元目の要素は3個、3次元目の要素は4個となります。
image.png

(5) size(A, n)
指定した次元の要素数を取得します。
下例では2次元目の要素数を取得しています。
image.png

(6) strides(A)
1次元配列上で要素がいくつ離れているか(1次元目に要素がいくつ入っているか)を取得します。
image.png

(7) stride(A, n)
n番目の次元のストライドを取得します。
下例では、2次元目のストライドを取得します。
image.png

③ブロードキャスティング

解説を見る

ブロードキャスティングとは、型(サイズ)の異なる配列同士の演算を行えるようにする仕組みです。ブロードキャスティングとして、以下の関数が使用できます。
 broadcast(f, args...)
 (下例) broadcast(+, A, C)

代表的な処理を2例示しますが、その他にも様々な処理がありますので、詳細は公式ドキュメントをご参照下さい。

(1)多次元配列Aに対して、サイズ(1行1列)の配列を加算する場合
配列Aを4行5列の2次元配列とします。これに対して配列C(1行1列の2次元配列)を加算した場合、配列Cは自動的にAと同じサイズに拡張され、演算が行われます。
image.png
実行例
image.png
image.png

(2)多次元配列Aに対して、サイズ(1行複数列)の配列を加算する場合
このような場合でもブロードキャスティングが可能です。
例えば、サイズが1行3列の配列DをAに加算する際、配列Dと配列Aの列数が等しいので加算することができます。
ブロードキャスティングの条件に以下が挙げられます。
 ・配列同士の各次元の大きさが同じ
 ・次元の大きさが異なる場合、片方のサイズが1
image.png
実行例
image.png
image.png

④変換(map)、集約(reduce)、フィルタリング(filter)、その他の演算

解説を見る

配列の各要素に対して、変換や集約やフィルタリングができます。

(1)変換(map)
配列の各要素に対して処理を適用します。
適用する処理をfとすると、以下のように使用することができます。
 map(f, A)

下例では、配列の各要素を2乗した配列を取得しています。
image.png

(2)集約(reduce)
各要素を集約するような何らかの処理を行います。
適用する処理をfとすると、以下のように使用することができます。
 reduce(f, A)

下例では、配列の各要素を加算する処理を行います。
image.png

(3)フィルタリング(filter)
要素に対して条件評価fを追加して抽出します。
 filter(f, A)

下例では、各要素の値が0.5以上の要素を抽出(フィルタリング)しています。
image.png

(4)その他の演算
 (4-1) 配列Aの要素のうち、最大の要素を取得します。
  maximum(A)
 (4-2) 配列Aの要素のうち、最小の要素を取得します。
  minimum(A)
 (4-3) 全ての要素の和を取得します。
  sum(A)
 (4-4) 配列Aの要素のうち、最大値の要素のインデックス番号
  argmax(A)
 (4-5) 配列Aの要素のうち、最小値の要素のインデックス番号
  argmim(A)

もくじ

Julia早引きノート[01]変数・定数の使い方
Julia早引きノート[02]算術式、演算子
Julia早引きノート[03]複素数
Julia早引きノート[04]正規表現
....

もくじを開く

Julia早引きノート[05]if文
Julia早引きノート[06]ループ処理
Julia早引きノート[07]try, catch, finally
Julia早引きノート[08]変数の型(Int, Float, Bool, Char, String)
Julia早引きノート[09]関数 (1)基本編
Julia早引きノート[10]関数 (2)応用編
Julia早引きノート[11]Nothing型
Julia早引きノート[12]複合型(Composite Type)型
Julia早引きノート[13]タプル
Julia早引きノート[14]リスト(Array型一次元配列)
Julia早引きノート[15]辞書(dictionary)
Julia早引きノート[16]集合
Julia早引きノート[17]多次元配列 (1)初期化
Julia早引きノート[18]多次元配列 (2)様々な演算や関数
Julia早引きノート[19]多次元配列 (3)サブ配列
Julia早引きノート[20]ファイル入出力
Julia早引きノート[21]JSON、XMLファイルの入出力
Julia早引きノート[22]Python関数やPythonモジュールの呼び出し
Julia早引きノート[23]JuliaでのMatplotlibによるグラフ描画
Julia早引きノート[24]CSVFiles(DataFrameとの連携)
Julia早引きノート[25]線形代数演算(ベクトル・行列計算)
(※引き続きコンテンツを増やしていきます)

関連情報

:paperclip: Julia - 公式ページ
https://julialang.org/

:paperclip: Julia - 日本語公式ドキュメント
https://julia-doc-ja.readthedocs.io/ja/latest/index.html

:paperclip: 初めてのJuliaとインストール (Windows & Linux)
https://qiita.com/ttlabo/items/b05bb43d06239f968035

:paperclip: Julia - Mathematics
https://docs.julialang.org/en/v1/base/math/

ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4