Skip to content

Commit 29cdfb6

Browse files
committed
Fixed BlockDiagonal
1 parent ff8d25a commit 29cdfb6

File tree

3 files changed

+45
-11
lines changed

3 files changed

+45
-11
lines changed

src/BlockBandedMatrices.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import BandedMatrices: isbanded, bandwidths, bandwidth, banded_getindex, colrang
4545
_banded_colval, _banded_rowval, _banded_nzval # for sparse
4646

4747
export BandedBlockBandedMatrix, BlockBandedMatrix, BlockSkylineMatrix, blockbandwidth, blockbandwidths,
48-
subblockbandwidth, subblockbandwidths, Ones, Zeros, Fill, Block, BlockTridiagonal, BlockBidiagonal, isblockbanded
48+
subblockbandwidth, subblockbandwidths, Ones, Zeros, Fill, Block, BlockDiagonal, BlockTridiagonal, BlockBidiagonal, isblockbanded
4949

5050

5151
const Block1 = Block{1,Int}

src/interfaceimpl.jl

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ const BlockDiagonal{T,VT<:Matrix{T}} = BlockMatrix{T,<:Diagonal{VT}}
2525

2626
BlockDiagonal(A) = mortar(Diagonal(A))
2727

28-
function sizes_from_blocks(A::Diagonal, _)
28+
function sizes_from_blocks(A::Diagonal, _)
2929
# for k = 1:length(A.du)
3030
# size(A.du[k],1) == sz[1][k] || throw(ArgumentError("block sizes of upper diagonal inconsisent with diagonal"))
3131
# size(A.du[k],2) == sz[2][k+1] || throw(ArgumentError("block sizes of upper diagonal inconsisent with diagonal"))
3232
# size(A.dl[k],1) == sz[1][k+1] || throw(ArgumentError("block sizes of lower diagonal inconsisent with diagonal"))
3333
# size(A.dl[k],2) == sz[2][k] || throw(ArgumentError("block sizes of lower diagonal inconsisent with diagonal"))
3434
# end
3535
(size.(A.diag, 1), size.(A.diag,2))
36-
end
36+
end
3737

3838

3939
# Block Bi/Tridiagonal
@@ -43,7 +43,7 @@ const BlockBidiagonal{T,VT<:Matrix{T}} = BlockMatrix{T,<:Bidiagonal{VT}}
4343
BlockTridiagonal(A,B,C) = mortar(Tridiagonal(A,B,C))
4444
BlockBidiagonal(A, B, uplo) = mortar(Bidiagonal(A,B,uplo))
4545

46-
function sizes_from_blocks(A::Tridiagonal, _)
46+
function sizes_from_blocks(A::Tridiagonal, _)
4747
# for k = 1:length(A.du)
4848
# size(A.du[k],1) == sz[1][k] || throw(ArgumentError("block sizes of upper diagonal inconsisent with diagonal"))
4949
# size(A.du[k],2) == sz[2][k+1] || throw(ArgumentError("block sizes of upper diagonal inconsisent with diagonal"))
@@ -53,7 +53,7 @@ function sizes_from_blocks(A::Tridiagonal, _)
5353
(size.(A.d, 1), size.(A.d,2))
5454
end
5555

56-
function sizes_from_blocks(A::Bidiagonal, _)
56+
function sizes_from_blocks(A::Bidiagonal, _)
5757
# for k = 1:length(A.du)
5858
# size(A.du[k],1) == sz[1][k] || throw(ArgumentError("block sizes of upper diagonal inconsisent with diagonal"))
5959
# size(A.du[k],2) == sz[2][k+1] || throw(ArgumentError("block sizes of upper diagonal inconsisent with diagonal"))
@@ -83,21 +83,44 @@ checksquareblocks(A) = blockisequal(axes(A)...) || throw(DimensionMismatch("bloc
8383

8484
for op in (:-, :+)
8585
@eval begin
86-
function $op(A::BlockTridiagonal, λ::UniformScaling)
86+
function $op(A::BlockDiagonal, λ::UniformScaling)
87+
checksquareblocks(A)
88+
mortar(Diagonal(broadcast($op, A.blocks.diag, Ref(λ))))
89+
end
90+
function $op::UniformScaling, A::BlockDiagonal)
91+
checksquareblocks(A)
92+
mortar(Diagonal(broadcast($op, Ref(λ), A.blocks.diag)))
93+
end
94+
95+
function $op(A::BlockTridiagonal, λ::UniformScaling)
8796
checksquareblocks(A)
8897
mortar(Tridiagonal(A.blocks.dl, broadcast($op, A.blocks.d, Ref(λ)), A.blocks.du))
8998
end
90-
function $op::UniformScaling, A::BlockTridiagonal)
99+
function $op::UniformScaling, A::BlockTridiagonal)
91100
checksquareblocks(A)
92101
mortar(Tridiagonal(broadcast($op,A.blocks.dl), broadcast($op, Ref(λ), A.blocks.d), broadcast($op,A.blocks.du)))
93102
end
94-
function $op(A::BlockBidiagonal, λ::UniformScaling)
103+
function $op(A::BlockBidiagonal, λ::UniformScaling)
95104
checksquareblocks(A)
96105
mortar(Bidiagonal(broadcast($op, A.blocks.dv, Ref(λ)), A.blocks.ev, A.blocks.uplo))
97106
end
98-
function $op::UniformScaling, A::BlockBidiagonal)
107+
function $op::UniformScaling, A::BlockBidiagonal)
99108
checksquareblocks(A)
100109
mortar(Bidiagonal(broadcast($op, Ref(λ), A.blocks.dv), broadcast($op,A.blocks.ev), A.blocks.uplo))
101110
end
102111
end
103-
end
112+
end
113+
114+
function replace_in_print_matrix(A::BlockDiagonal, i::Integer, j::Integer, s::AbstractString)
115+
bi = findblockindex.(axes(A), (i,j))
116+
I,J = block.(bi)
117+
i,j = blockindex.(bi)
118+
Int(J-I) == 0 ? s : Base.replace_with_centered_mark(s)
119+
end
120+
121+
function replace_in_print_matrix(A::BlockTridiagonal, i::Integer, j::Integer, s::AbstractString)
122+
bi = findblockindex.(axes(A), (i,j))
123+
I,J = block.(bi)
124+
i,j = blockindex.(bi)
125+
-1 Int(J-I)  1 ? s : Base.replace_with_centered_mark(s)
126+
end

test/test_misc.jl

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,17 @@ import BandedMatrices: bandwidths, AbstractBandedMatrix, BandedStyle, bandeddata
2121
@test BandedMatrix(V) == V
2222
end
2323

24+
@testset "Block Diagonal" begin
25+
A = BlockDiagonal(fill([1 2],3))
26+
@test blockbandwidths(A) == (0,0)
27+
@test isblockbanded(A)
28+
@test A[Block(1,1)] == [1 2]
29+
@test @inferred(getblock(A,1,2)) == @inferred(A[Block(1,2)]) == [0 0]
30+
@test_throws DimensionMismatch A+I
31+
A = BlockDiagonal(fill([1 2; 1 2],3))
32+
@test A+I == I+A == mortar(Diagonal(fill([2 2; 1 3],3))) == Matrix(A) + I
33+
end
34+
2435
@testset "Block Bidiagonal" begin
2536
Bu = BlockBidiagonal(fill([1 2],4), fill([3 4],3), :U)
2637
Bl = BlockBidiagonal(fill([1 2],4), fill([3 4],3), :L)
@@ -52,4 +63,4 @@ end
5263
@test A+I == I+A == mortar(Tridiagonal(fill([1 2; 1 2],3), fill([4 4; 3 5],4), fill([4 5; 4 5],3))) == Matrix(A) + I
5364
@test A-I == mortar(Tridiagonal(fill([1 2; 1 2],3), fill([2 4; 3 3],4), fill([4 5; 4 5],3))) == Matrix(A) - I
5465
@test I-A == mortar(Tridiagonal(fill(-[1 2; 1 2],3), fill([-2 -4; -3 -3],4), fill(-[4 5; 4 5],3))) == I - Matrix(A)
55-
end
66+
end

0 commit comments

Comments
 (0)