はじめに
『機械学習のエッセンス(http://isbn.sbcr.jp/93965/)』のPythonサンプルをJuliaで書き換えてみる。(第04章03配列の基本計算)の続きです。
疎行列の操作
JuliaにはSparse Arrays
モジュールというのがあるようです。
https://docs.julialang.org/en/v1/stdlib/SparseArrays/index.html
- JuliaはIndexが1からなので、配列の番号はすべて本よりプラス1しています。行列の番号と同じになるので場合によってはわかりやすいですね。
julia> using SparseArrays
julia> a = spzeros(4, 5)
4×5 SparseMatrixCSC{Float64,Int64} with 0 stored entries
julia> a[1, 2]
0.0
julia> a[1, 2] = 1
1
julia> a[1, 4] = 2
2
julia> a[3, 3] = 3
3
julia> a[4, 5] = 4
4
julia> a
4×5 SparseMatrixCSC{Float64,Int64} with 4 stored entries:
[1, 2] = 1.0
[3, 3] = 3.0
[1, 4] = 2.0
[4, 5] = 4.0
julia> Array(a)
4×5 Array{Float64,2}:
0.0 1.0 0.0 2.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 0.0 3.0 0.0 0.0
0.0 0.0 0.0 0.0 4.0
julia> b = spzeros(5, 4)
5×4 SparseMatrixCSC{Float64,Int64} with 0 stored entries
julia> b[1, 3] = 1
1
julia> b[2, 3] = 2
2
julia> b[3, 4] = 3
3
julia> b[4, 4] = 4
4
julia> Array(b)
5×4 Array{Float64,2}:
0.0 0.0 1.0 0.0
0.0 0.0 2.0 0.0
0.0 0.0 0.0 3.0
0.0 0.0 0.0 4.0
0.0 0.0 0.0 0.0
- 行列積の計算
julia> c = a * b
4×4 SparseMatrixCSC{Float64,Int64} with 3 stored entries:
[1, 3] = 2.0
[1, 4] = 8.0
[3, 4] = 9.0
julia> Array(c)
4×4 Array{Float64,2}:
0.0 0.0 2.0 8.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 9.0
0.0 0.0 0.0 0.0
- csr_matrixとcsc_matrix
scipy.sparse
にはcsr_matrix
とcsc_matrix
という型があって、本でもそれについて書かれています。Juliaにもあるのでしょうか?
上記で行列a
を作成すると4×5 SparseMatrixCSC{Float64,Int64} with 0 stored entries
というメッセージが表示されます。SparseMatrixCSC
とあるのでデフォルトでCSC型になるようです。
Juliaで型を調べて見ましたがSparseMatrixCRC
という型はないようです。
julia> SparseMatrixCSC
SparseMatrixCSC
julia> SparseMatrixCRC
ERROR: UndefVarError: SparseMatrixCRC not defined
Juliaでcsr_matrix
に相当するものはわかりませんでした。(デフォルトの配列がすでに行を取り出す操作が高速なのかもしれません。)
もう少し勉強してみます。