using LinearAlgebra: I
Julia言語では「単に数値を並べただけの1次元配列」は「数値を縦に並べてできる縦ベクトル」とみなされる.
したがって, 以下の3つは全部縦ベクトルになる. 以下では縦ベクトルを単にベクトルと呼ぶ.
v = [1,2,3]
v = [1;2;3]
v = [
1
2
3
]
次は1×3行列(2次元配列)になる. この節の目標はこれの説明ではない.
f = [2 3 -1]
1×3行列(1×3の2次元配列)と3次元ベクトル(長さ3の1次元配列)の積は1次元ベクトル(長さ1の1次元配列)になる.
f*v
スカラーを得るにはこうする.
(f*v)[1]
これは非常に面倒である. 以下のようにすればこのような手間がいらなくなる.
次は3次元双対ベクトルになる. (双対ベクトルは双対空間の要素=線形汎函数という意味. 教科書ではよく横ベクトル表記される.)
g = transpose([2, 3, -1])
(双対ベクトル)*(ベクトル)はスカラーになる. 双対空間の概念が実装されているのはJulia言語の大きな特徴である.
g*v
(ベクトル)*(双対ベクトル)は行列になる.
v*g
以下のようにして双対ベクトルを作ることもできる. こちらの方が書く分量が減る.
h = [2,3,-1]'
h*v
v*h
ただし, ' は単に転置を取るだけではなく共役を取る操作も含まれている.
a = [1+2im, 3+4im]
a'
次のような場合には積を意味する*を省略できる.
a'a
単に共役を取るには次のようにする.
conj(a)
実部と虚部は次の通り.
real(a)
imag(a)
A = [1 2 3; 4 5 6; 7 8 9]
A = [
1 2 3
4 5 6
7 8 9
]
A + 10I
10I*v
(行列)*(ベクトル)はベクトルになる.
A*v
(双対ベクトル)*(行列)は双対ベクトルになる.
g*A
h*A
(双対ベクトル)*(行列)*(ベクトル)はスカラーになる. (1×1行列になったりしない)
g*A*v
h*A*v
x = 1:4
y = 1:3
(縦ベクトル) .+ (横(双対)ベクトル) の形式で行列を作ることもできる.
x .+ im*y'
より一般に φ.(x, y') の形式で行列を作ることができる.
φ(x, y) = x^2 + im*y
φ.(x, y')
[
A v
g 0
]
P = [11 12; 13 14]
Q = [21 22; 23 24]
R = [31 32; 33 34]
S = [41 42; 43 44]
T = [P Q; R S]
1:3 はベクトル=1次元配列にはならない.
1:3
typeof(1:3)
1次元配列に変換するには以下のような方法がある.
Array(1:3)
Vector(1:3)
collect(1:3)
[1:3;]
セミコロンは次のような使い方もできる. (時間を逆戻しする動画を作るときに使われる.)
[1:5; 4:-1:1]
x = range(1, 3, length=3)
y = range(1, 4, length=4)
x_grid = repeat(x', length(y))
y_grid = repeat(y, 1, length(x))
z = @.(x' + im*y)
x_grid = real(z)
y_grid = imag(z)
ψ(x,y) = x^2 - y^2
以下の2つの結果は同じになる. x_grid, y_gridを使っている側は無駄にコードを長くしていてかつ無駄にメモリを消費している.
ψ.(x_grid, y_grid)
ψ.(x', y)
0を並べる.
O = zeros(2, 3)
O_int = zeros(Int, 2, 3)
1を並べる.
K = ones(2, 3)
K_int = ones(Int, 2, 3)
対角成分に1を並べ, 他は0にする.
E = Matrix{Int}(I, 3, 4)
乱数で初期化.
r = rand(3) # 0~1の一様分布
R = randn(3,3) # 標準正規分布乱数
既存の行列と同じ型・同じサイズの零行列と単位行列.
zero(K)
one(R)
u = Array{Float64, 1}(undef, 3)
u = Vector{Float64}(undef, 3)
X = Array{Float64, 2}(undef, 3, 4)
X = Matrix{Float64}(undef, 3, 4)
既存の配列と同じ型・同じサイズの初期化されていない入れる.
S = similar(K)