10.3.1 注意

もちろん、$ 1\times n$ Array と $ n\times 1$ Array の積は $ 1\times 1$ Array ($ 1$-element Array) である。 例えば、 [1 2][1;2] の積は [5] であって、 5 ではない。
julia> a=[1 2]
julia> v=[1;2]
julia> a*v
1-element Array{Int64,1}:
 5

julia> [5]
1-element Array{Int64,1}:
 5

[5] から $ 5$ を得るには、第1要素を取り出せば良いので、 [5][1] とする (うへえ)。 A=[5] として A[1] と書く分には違和感がないかな?


$ n\times 1$ Array は $ n$ 次元ベクトル、つまり $ \mathbb{R}^n$ の要素とみなして良いが、 $ \mathbb{R}^n$ の双対空間の要素に相当するものが用意されている。

$ n\times 1$ Array を transpose() すると、 $ (\mathbb{R}^n)'$ の要素 (双対ベクトル) になる。 それと $ n\times 1$ Array ($ n$-element Array) をかけると、 スカラー ( $ \mathbb{R}$ の要素) になる。
julia> g=transpose([1,2])
1×2 LinearAlgebra.Transpose{Int64,Array{Int64,1}}:
 1  2

julia> v=[1,2]
2-element Array{Int64,1}:
 1
 2

julia> g*v
5

tanspose() に似ているものに ' 演算子がある。 ' は Hermite 共役を作る。
julia> g2=[1,2]'
1×2 LinearAlgebra.Transpose{Int64,Array{Int64,1}}:
 1  2

julia> v=[1,2]
2-element Array{Int64,1}:
 1
 2

julia> g2*v
5

julia> g3=[1,2im]'
julia> g3*v
1×2 LinearAlgebra.Adjoint{Complex{Int64},Array{Complex{Int64},1}}:
 1+0im  0-2im

julia> g3*v
1 - 4im

$\displaystyle \begin{pmatrix}
1  2i
\end{pmatrix}^\ast
=\begin{pmatrix}
1...
...pmatrix}
1 &-2i
\end{pmatrix} \begin{pmatrix}
] 1  2
\end{pmatrix} =1-4i
$

MATLAB で 1:3 とすると、 [1 2 3] という横ベクトルが得られるが、 Julia でそれに近いことをするには Array(1:3) とする。 ただし、これは 3 次元縦ベクトル [1,2,3] である。

https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/

inv(a)a の逆行列を計算する。

zeros(m,n) は零行列、 zeros(n)zeros(n,1) と同じ (MATLAB だと zeros(n,n) と同じになる)。 zeros(Int64,m,n) のように成分の型を指定できるが、 省略すると Float64 になる。

ones(m,n) は全ての成分が1の行列である。 ones(n)ones(n,1) と同じ。 これでも ones(Int64,m,n) のように成分の型を指定できる。

rand(m,n) というのもある。 rand(n)rand(n,1) と同じ。

Diagonal() は対角部分を取り出す。

$ m\times n$ Array A に対して、 A(i,:) とすると $ i$ 行目、 A(:,j) とすると $ j$ 列目が取り出せる。 ただしどちらも縦ベクトルになる (縦ベクトルを偏愛している)。 前者は $ n$-element Array, 前者は $ m$-element Array である。

単位行列    (ここは良く分かっていない)     単位行列として eye(m,n) というのはなくなった。 単に I というオペレーターを使う (UniformScaling{Bool} true*I であるとか。 1.0I とか UniformScaling(1.0) を使うべきか? どちらも UniformScaling{Float64} 1.0*I)。
julia> using LinearAlgebra
julia> a=[1 2; 3 4]
julia> a*inv(a)-I
2×2 Array{Float64,2}:
 0.0           0.0
 8.88178e-16  -4.44089e-16

しかし I 単独では、operator であって、 行列とみなす場合のサイズすら定まらない。

どうしても Array が欲しければ
julia> myI=Matrix(1.0I,m,n)
とすれば良い。なるほど。

これだとメモリーを使いすぎるので、対角行列にするべきか?
julia> I3=Diagonal(ones(Float64,3))
3×3 Diagonal{Float64,Array{Float64,1}}:
 1.0   ⋅    ⋅
  ⋅   1.0   ⋅
  ⋅    ⋅   1.0
あるいは Sparse Array にする?
julia> using SparseArrays
julia> I3=sparse(Diagonal(ones(Float64,3)))
3×3 SparseMatrixCSC{Float64,Int64} with 3 stored entries:
  [1, 1]  =  1.0
  [2, 2]  =  1.0
  [3, 3]  =  1.0

色々用意してあるわけだ。



桂田 祐史