Skip to content

Commit 18c9029

Browse files
committed
Fix bugs & add tests for triangular matrices
1 parent d0a50e0 commit 18c9029

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

base/linalg/triangular.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ scale!(c::Number, A::Union{UpperTriangular,LowerTriangular}) = scale!(A,c)
362362

363363
A_mul_B!(A::Tridiagonal, B::AbstractTriangular) = A*full!(B)
364364
A_mul_B!(C::AbstractVecOrMat, A::AbstractTriangular, B::AbstractVecOrMat) = A_mul_B!(A, copy!(C, B))
365-
A_mul_Bc!(C::AbstractVecOrMat, A::AbstractTriangular, B::AbstractVecOrMat) = A_mul_Bc!(A, copy!(C, B))
365+
A_mul_Bc!(C::AbstractVecOrMat, A::AbstractTriangular, B::AbstractVecOrMat) = A_mul_B!(A, ctranspose!(C, B))
366366

367367
for (t, uploc, isunitc) in ((:LowerTriangular, 'L', 'N'),
368368
(:UnitLowerTriangular, 'L', 'U'),
@@ -1022,7 +1022,7 @@ end
10221022
### Right division with triangle to the right hence lhs cannot be transposed. Quotients.
10231023
for (f, g) in ((:/, :A_rdiv_B!), (:A_rdiv_Bc, :A_rdiv_Bc!), (:A_rdiv_Bt, :A_rdiv_Bt!))
10241024
@eval begin
1025-
function ($f){TA,TB,S}(A::StridedVecOrMat{TA}, B::Union{UnitUpperTriangular{TB,S},UnitLowerTriangular{TB,S}})
1025+
function ($f){TA,TB,S}(A::StridedVecOrMat{TA}, B::Union{UpperTriangular{TB,S},LowerTriangular{TB,S}})
10261026
TAB = typeof((zero(TA)*zero(TB) + zero(TA)*zero(TB))/one(TA))
10271027
($g)(copy_oftype(A, TAB), convert(AbstractArray{TAB}, B))
10281028
end

test/linalg/triangular.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ for elty1 in (Float32, Float64, Complex64, Complex128, BigFloat, Int)
134134
copy!(B, A1.')
135135
@test B == A1.'
136136

137+
#expm/logm
138+
if (elty1 == Float64 || elty1 == Complex128) && (t1 == UpperTriangular || t1 == LowerTriangular)
139+
@test expm(full(logm(A1))) full(A1)
140+
end
141+
137142
# scale
138143
if (t1 == UpperTriangular || t1 == LowerTriangular)
139144
unitt = istriu(A1) ? UnitUpperTriangular : UnitLowerTriangular
@@ -282,6 +287,10 @@ for elty1 in (Float32, Float64, Complex64, Complex128, BigFloat, Int)
282287
@test_approx_eq B[:,1]'A1' B[:,1]'full(A1)'
283288
@test_approx_eq B'A1' B'full(A1)'
284289

290+
if eltyB == elty1
291+
@test_approx_eq A_mul_B!(zeros(B),A1,B) A1*B
292+
@test_approx_eq A_mul_Bc!(zeros(B),A1,B) A1*B'
293+
end
285294
#error handling
286295
@test_throws DimensionMismatch Base.LinAlg.A_mul_B!(A1, ones(eltyB,n+1))
287296
@test_throws DimensionMismatch Base.LinAlg.A_mul_B!(ones(eltyB,n+1,n+1), A1)
@@ -305,6 +314,7 @@ for elty1 in (Float32, Float64, Complex64, Complex128, BigFloat, Int)
305314

306315
# Error bounds
307316
elty1 != BigFloat && errorbounds(A1, A1\B, B)
317+
308318
end
309319
end
310320
end

0 commit comments

Comments
 (0)