Demonstration of Operator Algebras and Kron
Let M
, D
, F
be matrix-based, diagonal-matrix-based, and function-based SciMLOperators
respectively. Here are some examples of composing operators in order to build more complex objects and using their operations.
using SciMLOperators, LinearAlgebra
N = 4
function f(v, u, p, t)
u .* v
end
function f(w, v, u, p, t)
w .= u .* v
end
u = rand(4)
p = nothing # parameter struct
t = 0.0 # time
M = MatrixOperator(rand(N, N))
D = DiagonalOperator(rand(N))
F = FunctionOperator(f, zeros(N), zeros(N); u, p, t)
FunctionOperator(4 × 4)
Then, the following codes just work.
L1 = 2M + 3F + LinearAlgebra.I + rand(N, N)
L2 = D * F * M'
L3 = kron(M, D, F)
L4 = lu(M) \ D
L5 = [M; D]' * [M F; F D] * [F; D]
((((MatrixOperator(4 × 4) * MatrixOperator(4 × 4)) + (DiagonalOperator(4 × 4) * FunctionOperator(4 × 4))) * FunctionOperator(4 × 4)) + (((MatrixOperator(4 × 4) * FunctionOperator(4 × 4)) + (DiagonalOperator(4 × 4) * DiagonalOperator(4 × 4))) * DiagonalOperator(4 × 4)))
Each L#
can be applied to AbstractVector
s of appropriate sizes:
v = rand(N)
w = L1(v, u, p, t) # == L1 * v
v_kron = rand(N^3)
w_kron = L3(v_kron, u, p, t) # == L3 * v_kron
64-element reshape(transpose(::Matrix{Float64}), 64) with eltype Float64:
0.05861857394111356
0.12236527702384231
0.08913947568683196
0.00858186065873634
0.35996125660636513
0.3054990570685234
0.38204260534698126
0.02138958623255424
0.09867782183388167
0.07382095890083892
⋮
0.016241255812495088
0.13617037527536052
0.17456772800893272
0.14622504609065148
0.010426532186213163
0.1357651799192775
0.2122436860972691
0.0912012016914316
0.013999497364719634
For mutating operator evaluations, call cache_operator
to generate an in-place cache, so the operation is nonallocating.
α, β = rand(2)
# allocate cache
L2 = cache_operator(L2, u)
L4 = cache_operator(L4, u)
# allocation-free evaluation
L2(w, v, u, p, t) # == mul!(w, L2, v)
L4(w, v, u, p, t, α, β) # == mul!(w, L4, v, α, β)
4-element Vector{Float64}:
0.5145138988622928
0.03143959353432591
0.2750636073670465
-0.22529164283858788