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

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

```ruby: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)、その他の演算


####①多次元配列の演算

<details><summary>解説を見る</summary><div>

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

: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次元配列とします。

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

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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/1d481307-725b-684f-7112-620864efd533.png)

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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/bb18cf6d-04bd-5180-3aeb-bc0b6bc5437c.png)

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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/c1150482-3761-e3c8-bf34-d7b6ecf16c3b.png)

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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/de8d0a17-7888-b4e8-dc97-a99403840980.png)


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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/beb31f18-9f2c-d42b-864e-64abd1a6af78.png)

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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/61b25d40-efde-0a5f-378f-dcb0b0c378f9.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の要素ごとの加算)**

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/76afef34-6af6-bb62-a1d3-b885fe7e0599.png)

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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/1a487cf2-e8da-7cf3-b4b1-fe02a7cbbcd4.png)


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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/051b74d4-c9be-12d8-7633-2b9584d3cdf2.png)

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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/ae2e5135-3e88-cc19-00d2-d7d1628f6642.png)

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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/e918e4e6-81a3-d527-1a8b-eda06f9ca70d.png)


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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/d23ff348-8a33-5219-b9ff-d1ba9ae837f2.png)

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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/45c74d2d-3aa0-cdf0-86a6-4bfc13f7fe9f.png)

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

```math
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/4c6fbb30-721d-65e2-fd84-b01e47f1912e.png)


</div></details>


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

<details><summary>解説を見る</summary><div>

主要な関数を以下にまとめました。
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/b12b8f76-f88f-a4e0-fcdf-7750862357fc.png)

**(2) length(A)**
Aの要素数を取得します。
下例では、3次元配列で各次元の要素が2個、3個、3個なので、全要素数は18個となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/cf4717ee-2da5-634c-2c80-fffe3ef0a5e5.png)


**(3) ndims(A)**
次元数を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/a6b0287e-22c4-5916-b88c-87f3f0db5354.png)

**(4) size(A)**
サイズ(次元ごとの要素数)を取得します。
1次元目の要素は2個、2次元目の要素は3個、3次元目の要素は4個となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/38359f9c-ffb5-d3f2-9a40-dacfafca7bbb.png)

**(5) size(A, n)**
指定した次元の要素数を取得します。
下例では2次元目の要素数を取得しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/3c633ed1-2174-48f7-ba76-d9dc53becd4e.png)

**(6) strides(A)**
1次元配列上で要素がいくつ離れているか(1次元目に要素がいくつ入っているか)を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/b04def60-386c-c688-9afc-37ebbf8eaef5.png)

**(7) stride(A, n)**
n番目の次元のストライドを取得します。
下例では、2次元目のストライドを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/fafbb92d-6585-0605-50a1-8525750c2409.png)

</div></details>

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

<details><summary>解説を見る</summary><div>


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

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

**(1)多次元配列Aに対して、サイズ(1行1列)の配列を加算する場合**
配列Aを4行5列の2次元配列とします。これに対して配列C(1行1列の2次元配列)を加算した場合、配列Cは自動的にAと同じサイズに拡張され、演算が行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/f13ed6e6-28da-f6a0-efa5-d23873e24eda.png)
実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/f63b517e-8751-97e8-b849-c074d1b10293.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/c8ccc464-be7e-61e8-69a3-7deee82f03eb.png)


**(2)多次元配列Aに対して、サイズ(1行複数列)の配列を加算する場合**
このような場合でもブロードキャスティングが可能です。
例えば、サイズが1行3列の配列DをAに加算する際、配列Dと配列Aの列数が等しいので加算することができます。
ブロードキャスティングの条件に以下が挙げられます。
　**・配列同士の各次元の大きさが同じ**
　**・次元の大きさが異なる場合、片方のサイズが1**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/53cc335e-6105-d3a7-9f48-a6497903609e.png)
実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/8a4cb0aa-9f25-fe13-39f4-b585c168a2d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/e6d2aa00-1213-bb01-272f-3ff1afd38324.png)

</div></details>

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

<details><summary>解説を見る</summary><div>


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

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

下例では、配列の各要素を2乗した配列を取得しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/a1ef20a8-3d90-c17a-9d63-f48f8a6683d5.png)

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

下例では、配列の各要素を加算する処理を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/de1d6f9d-b3b8-c5dd-4dc7-60afd2ebfcca.png)

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

下例では、各要素の値が0.5以上の要素を抽出(フィルタリング)しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/cdd7d5a6-cad5-f197-8bd3-fa720ebefbbe.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)**

</div></details>


##もくじ
[Julia早引きノート［01］変数・定数の使い方](https://qiita.com/ttabata/items/a1ada2c0cba03672e105)
[Julia早引きノート［02］算術式、演算子](https://qiita.com/ttabata/items/90900d0914fa317f652d)
[Julia早引きノート［03］複素数]
(https://qiita.com/ttabata/items/225c77a4d71fafc3e482)
[Julia早引きノート［04］正規表現](https://qiita.com/ttabata/items/8b6e4a2b7c2ca299de03)
....
<details><summary>もくじを開く</summary><div>
[Julia早引きノート［05］if文]
(https://qiita.com/ttabata/items/4f0bcff1e32f60402dfb)
[Julia早引きノート［06］ループ処理]
(https://qiita.com/ttabata/items/2a53825101b0b75fb589)
[Julia早引きノート［07］try, catch, finally]
(https://qiita.com/ttabata/items/1d6fe990526c99b65b5f)
[Julia早引きノート［08］変数の型(Int, Float, Bool, Char, String)]
(https://qiita.com/ttabata/items/2b84a826e39bfe432b62)
[Julia早引きノート［09］関数 (1)基本編]
(https://qiita.com/ttabata/items/d9b4f2728ec0dbcc6394)
[Julia早引きノート［10］関数 (2)応用編]
(https://qiita.com/ttabata/items/462e216c43d519f1969d)
[Julia早引きノート［11］Nothing型]
(https://qiita.com/ttabata/items/0e5a6b21968d8752cf0b)
[Julia早引きノート［12］複合型(Composite Type)型]
(https://qiita.com/ttabata/items/27469216a3c33101c825)
[Julia早引きノート［13］タプル]
(https://qiita.com/ttabata/items/ebe35dbfec4efbc1c29a)
[Julia早引きノート［14］リスト(Array型一次元配列)]
(https://qiita.com/ttabata/items/7528863ccbb282e8260d)
[Julia早引きノート［15］辞書(dictionary)]
(https://qiita.com/ttabata/items/77a4f1d02b51d067bfb7)
[Julia早引きノート［16］集合]
(https://qiita.com/ttabata/items/ca8137922a785122037e)
[Julia早引きノート［17］多次元配列 (1)初期化]
(https://qiita.com/ttabata/items/01fecbd14363460a27a6)
[Julia早引きノート［18］多次元配列 (2)様々な演算や関数]
(https://qiita.com/ttabata/items/f35896a5fa005fba7fbc)
[Julia早引きノート［19］多次元配列 (3)サブ配列]
(https://qiita.com/ttabata/items/045c00406fe45270b42e)
[Julia早引きノート［20］ファイル入出力]
(https://qiita.com/ttabata/items/5a99c3998060d161ace8)
[Julia早引きノート［21］JSON、XMLファイルの入出力]
(https://qiita.com/ttabata/items/65ebec11830271f9be71)
[Julia早引きノート［22］Python関数やPythonモジュールの呼び出し]
(https://qiita.com/ttabata/items/3afc8cef40d1e98a7b17)
[Julia早引きノート［23］JuliaでのMatplotlibによるグラフ描画]
(https://qiita.com/ttabata/items/96a0e172addfac690cca)
[Julia早引きノート［24］CSVFiles(DataFrameとの連携)]
(https://qiita.com/ttabata/items/51446731a703b5aca524)
[Julia早引きノート［25］線形代数演算(ベクトル・行列計算)]
(https://qiita.com/ttabata/items/5abe14d5c510e8ca0f54)
(※引き続きコンテンツを増やしていきます)
</div></details>

##関連情報

: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/


##ご意見など

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