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