Skip to content

Commit

Permalink
Fix #11256 and fix the tests that should have caught this. Dividing
Browse files Browse the repository at this point in the history
unit triangular matrix gave wrong result.
  • Loading branch information
andreasnoack committed May 13, 2015
1 parent e2dbab5 commit c6d0759
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 70 deletions.
110 changes: 44 additions & 66 deletions base/linalg/triangular.jl
Original file line number Diff line number Diff line change
Expand Up @@ -265,73 +265,51 @@ eigvecs{T<:BlasFloat,S<:StridedMatrix}(A::UnitLowerTriangular{T,S}) = (for i = 1
# Generic routines #
####################

(*)(A::UpperTriangular, x::Number) = UpperTriangular(A.data*x)
(*)(A::LowerTriangular, x::Number) = LowerTriangular(A.data*x)
function (*)(A::UnitUpperTriangular, x::Number)
B = A.data*x
for i = 1:size(A, 1)
B[i,i] = x
end
UpperTriangular(B)
end
function (*)(A::UnitLowerTriangular, x::Number)
B = A.data*x
for i = 1:size(A, 1)
B[i,i] = x
end
LowerTriangular(B)
end
(*)(x::Number, A::UpperTriangular) = UpperTriangular(x*A.data)
(*)(x::Number, A::LowerTriangular) = LowerTriangular(x*A.data)
function (*)(x::Number, A::UnitUpperTriangular)
B = x*A.data
for i = 1:size(A, 1)
B[i,i] = x
end
UpperTriangular(B)
end
function (*)(x::Number, A::UnitLowerTriangular)
B = x*A.data
for i = 1:size(A, 1)
B[i,i] = x
end
LowerTriangular(B)
end
(/)(A::UpperTriangular, x::Number) = UpperTriangular(A.data/x)
(/)(A::LowerTriangular, x::Number) = LowerTriangular(A.data/x)
function (/)(A::UnitUpperTriangular, x::Number)
B = A.data*x
invx = inv(x)
for i = 1:size(A, 1)
B[i,i] = x
end
UpperTriangular(B)
end
function (/)(A::UnitLowerTriangular, x::Number)
B = A.data*x
invx = inv(x)
for i = 1:size(A, 1)
B[i,i] = x
end
LowerTriangular(B)
end
(\)(x::Number, A::UpperTriangular) = UpperTriangular(x\A.data)
(\)(x::Number, A::LowerTriangular) = LowerTriangular(x\A.data)
function (\)(x::Number, A::UnitUpperTriangular)
B = x\A.data
invx = inv(x)
for i = 1:size(A, 1)
B[i,i] = invx
end
UpperTriangular(B)
end
function (\)(x::Number, A::UnitLowerTriangular)
B = x\A.data
invx = inv(x)
for i = 1:size(A, 1)
B[i,i] = invx
for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
(LowerTriangular, UnitLowerTriangular))
@eval begin
(*)(A::$t, x::Number) = $t(A.data*x)

function (*)(A::$unitt, x::Number)
B = A.data*x
for i = 1:size(A, 1)
B[i,i] = x
end
$t(B)
end

(*)(x::Number, A::$t) = $t(x*A.data)

function (*)(x::Number, A::$unitt)
B = x*A.data
for i = 1:size(A, 1)
B[i,i] = x
end
$t(B)
end

(/)(A::$t, x::Number) = $t(A.data/x)

function (/)(A::$unitt, x::Number)
B = A.data/x
invx = inv(x)
for i = 1:size(A, 1)
B[i,i] = invx
end
$t(B)
end

(\)(x::Number, A::$t) = $t(x\A.data)

function (\)(x::Number, A::$unitt)
B = x\A.data
invx = inv(x)
for i = 1:size(A, 1)
B[i,i] = invx
end
$t(B)
end
end
LowerTriangular(B)
end

## Generic triangular multiplication
Expand Down
8 changes: 4 additions & 4 deletions test/linalg/triangular.jl
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,10 @@ for elty1 in (Float32, Float64, Complex64, Complex128, BigFloat, Int)
@test full(-A1) == -full(A1)

# Binary operations
@test A1*0.5 == full(A1*0.5)
@test 0.5*A1 == full(0.5*A1)
@test A1/0.5 == full(A1/0.5)
@test 0.5\A1 == full(0.5\A1)
@test A1*0.5 == full(A1)*0.5
@test 0.5*A1 == 0.5*full(A1)
@test A1/0.5 == full(A1)/0.5
@test 0.5\A1 == 0.5\full(A1)

# inversion
@test_approx_eq inv(A1) inv(lufact(full(A1)))
Expand Down

0 comments on commit c6d0759

Please sign in to comment.