Skip to content

Commit 55201fd

Browse files
committed
sketch new type
1 parent 6179eb9 commit 55201fd

File tree

2 files changed

+67
-23
lines changed

2 files changed

+67
-23
lines changed

src/semiseparable_arrowhead.jl

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
struct SemiseparableBBBArrowheadMatrix{T} <: AbstractBlockBandedMatrix{T}
2+
# banded parts
3+
A::BandedMatrix{T}
4+
B::NTuple{2,BandedMatrix{T}} # first row blocks
5+
C::NTuple{4,BandedMatrix{T}} # first col blocks
6+
D
7+
8+
# fill parts
9+
Asub::NTuple{2,Vector{T}}
10+
Asup::Tuple{2,Matrix{T}} # matrices are m × 2
11+
12+
Bsub::NTuple{2,Vector{T}}
13+
Bsup::NTuple{2,NTuple{2,Vector{T}}}
14+
15+
Csub::NTuple{2,NTuple{2,Vector{T}}}
16+
Csup::NTuple{2,Vector{T}}
17+
18+
A22sub::NTuple{2,Vector{T}}
19+
A32sub::NTuple{2,Vector{T}}
20+
21+
A32extra::Vector{T}
22+
A33extra::Vector{T}
23+
24+
D::DD # these are interlaces
25+
26+
end
27+
28+
function getindex(L::SemiseparableBBBArrowheadMatrix{T}, Kk::BlockIndex{1}, Jj::BlockIndex{1})::T where T
29+
K,k = block(Kk),blockindex(Kk)
30+
J,j = block(Jj),blockindex(Jj)
31+
# TODO: add getindex
32+
end
33+
34+
35+
function getindex(L::SemiseparableBBBArrowheadMatrix, k::Int, j::Int)
36+
ax,bx = axes(L)
37+
L[findblockindex(ax, k), findblockindex(bx, j)]
38+
end
39+

test/explore_QL.jl

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using PiecewiseOrthogonalPolynomials, Plots, BlockArrays
1+
using PiecewiseOrthogonalPolynomials, Plots, BlockArrays, Test
22
using MatrixFactorizations, LinearAlgebra, BlockBandedMatrices
33
###
44
# QL
@@ -9,9 +9,9 @@ function my_ql(A::BBBArrowheadMatrix{T}) where T
99
m2, n2 = size(A.D[1])
1010
@assert m == n == l+1
1111
@assert m2 == n2
12-
#results stored in F and tau
12+
#results stored in F and τ
1313
F = BlockedArray(Matrix(A), axes(A))
14-
tau = zeros(m+l*m2)
14+
τ = zeros(m+l*m2)
1515
for j in m2:-1:3
1616
for i in l:-1:1
1717
upper_entry = F[Block(j-1, j+1)][i, i] #A.D[i][j-2,j]
@@ -28,7 +28,7 @@ function my_ql(A::BBBArrowheadMatrix{T}) where T
2828
print(dia_entry_new)
2929
F[m+(j-1)*l+i, m+(j-1)*l+i] = dia_entry_new #update F[Block(j+1, j+1)][i, i]
3030
F[m+(j-3)*l+i, m+(j-1)*l+i] = v[1]/v[2] #update F[Block(j-1, j+1)][i, i]
31-
tau[m+(j-1)*l+i] = coef*v[2]^2
31+
τ[m+(j-1)*l+i] = coef*v[2]^2
3232
#row recombination(householder transformation) for other columns
3333
current_upper_entry = F[Block(j-1, j-1)][i, i] #A.D[i][j-2,j-2]
3434
current_lower_entry = F[Block(j+1, j-1)][i, i] #A.D[i][j,j-2]
@@ -53,41 +53,41 @@ function my_ql(A::BBBArrowheadMatrix{T}) where T
5353
end
5454

5555
#Deal with Block(1,3)
56-
#vectors x and Lambda denote a rank 1 semiseperable matrix
57-
lambda = 1.0
58-
Lambda = []
56+
#vectors x and Λ denote a rank 1 semiseperable matrix
57+
λ = 1.0
58+
Λ = []
5959
x = [F[Block(1,3)][l+1,l]]
6060
x_len = abs(x[1])
6161
for i in l:-1:2 #consider i=1 later
6262
a = F[Block(1,3)][i,i]
6363
b = F[Block(1,3)][i,i-1]
6464
c = F[Block(3,3)][i,i]
65-
v_last = c + sign(c) * sqrt(a^2 + lambda^2 * x_len^2 + c^2)
66-
v_len = sqrt(a^2 + lambda^2 * x_len^2 + v_last^2)
67-
F[m+l+i,m+l+i] = -sign(c) * sqrt(a^2 + lambda^2 * x_len^2 + c^2)
68-
pushfirst!(Lambda, lambda / v_last)
69-
lambda = -2/v_len^2 * a * b * lambda
65+
v_last = c + sign(c) * sqrt(a^2 + λ^2 * x_len^2 + c^2)
66+
v_len = sqrt(a^2 + λ^2 * x_len^2 + v_last^2)
67+
F[m+l+i,m+l+i] = -sign(c) * sqrt(a^2 + λ^2 * x_len^2 + c^2)
68+
pushfirst!(Λ, λ / v_last)
69+
λ = -2/v_len^2 * a * b * λ
7070
F[m+l+i, m+l+i-1] = -2/v_len^2 * v_last * a * b
71-
x_first = (1 - 2/v_len^2 * a^2) * b / lambda
71+
x_first = (1 - 2/v_len^2 * a^2) * b / λ
7272
pushfirst!(x, x_first)
7373
x_len = sqrt(x_len^2 + x_first^2)
7474
#record information of V
7575
F[i+1, m+l+i] = 0
7676
F[i, m+l+i] = a / v_last
77-
tau[m+l+i] = 2 * v_last^2 / v_len^2
77+
τ[m+l+i] = 2 * v_last^2 / v_len^2
7878
end
7979
#deal with the last column in Block(1,3)
8080
a = F[Block(1,3)][1,1]
8181
c = F[Block(3,3)][1,1]
82-
v_last = c + sign(c) * sqrt(a^2 + lambda^2 * x_len^2 + c^2)
83-
v_len = sqrt(a^2 + lambda^2 * x_len^2 + v_last^2)
84-
pushfirst!(Lambda, lambda / v_last)
85-
F[m+l+1,m+l+1] = -sign(c) * sqrt(a^2 + lambda^2 * x_len^2 + c^2)
82+
v_last = c + sign(c) * sqrt(a^2 + λ^2 * x_len^2 + c^2)
83+
v_len = sqrt(a^2 + λ^2 * x_len^2 + v_last^2)
84+
pushfirst!(Λ, λ / v_last)
85+
F[m+l+1,m+l+1] = -sign(c) * sqrt(a^2 + λ^2 * x_len^2 + c^2)
8686
F[2, m+l+1] = 0
8787
F[1, m+l+1] = a / v_last
88-
tau[m+l+1] = 2 * v_last^2 / v_len^2
88+
τ[m+l+1] = 2 * v_last^2 / v_len^2
8989

90-
F, tau, x, Lambda
90+
F, τ, x, Λ
9191
end
9292

9393

@@ -104,6 +104,11 @@ KR = Block.(Base.OneTo(N))
104104
Mₙ = M[KR,KR]
105105
Δₙ = Δ[KR,KR]
106106
A = Δₙ + 100^2 * Mₙ
107-
FF,ttau, xx, LLambda = my_ql(A)
108-
#tau = ql(A).τ
109-
#f = ql(A).factors
107+
FF,tτ, xx, LΛ = my_ql(A)
108+
τ = ql(A).τ
109+
f = ql(A).factors
110+
111+
@test BlockedArray(tτ, (axes(A,2),))[Block.(3:6)] BlockedArray(τ, (axes(A,2),))[Block.(3:6)]
112+
@test f[:,Block.(4:6)] FF[:,Block.(4:6)]
113+
114+
@test tril(xx *') + FF[Block(1,3)][2:end,:] f[Block(1,3)][2:end,:]

0 commit comments

Comments
 (0)