Skip to content

Commit

Permalink
Allow setindex! in zero part of Triangular matrices...
Browse files Browse the repository at this point in the history
as long as the value is zero

(cherry picked from commit 566acb1)
ref #13587
  • Loading branch information
mbauman authored and tkelman committed Oct 31, 2015
1 parent 6446a16 commit fbe97b1
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 17 deletions.
34 changes: 21 additions & 13 deletions base/linalg/triangular.jl
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ for t in (:LowerTriangular, :UnitLowerTriangular, :UpperTriangular, :UnitUpperTr
convert{T,S}(::Type{Matrix}, A::$t{T,S}) = convert(Matrix{T}, A)

function similar{T,S,Tnew}(A::$t{T,S}, ::Type{Tnew}, dims::Dims)
if dims[1] != dims[2]
throw(ArgumentError("Triangular matrix must be square"))
end
if length(dims) != 2
throw(ArgumentError("Triangular matrix must have two dimensions"))
end
if dims[1] != dims[2]
throw(ArgumentError("Triangular matrix must be square"))
end
B = similar(A.data, Tnew, dims)
return $t(B)
end
Expand Down Expand Up @@ -119,33 +119,41 @@ getindex{T,S}(A::UpperTriangular{T,S}, i::Integer, j::Integer) = i <= j ? A.data

function setindex!(A::UpperTriangular, x, i::Integer, j::Integer)
if i > j
throw(BoundsError(A,(i,j)))
x == 0 || throw(ArgumentError("cannot set index in the lower triangular part ($i, $j) of an UpperTriangular matrix to a nonzero value ($x)"))
else
A.data[i,j] = x
end
A.data[i,j] = x
return A
end

function setindex!(A::UnitUpperTriangular, x, i::Integer, j::Integer)
if i >= j
throw(BoundsError(A,(i,j)))
if i > j
x == 0 || throw(ArgumentError("cannot set index in the lower triangular part ($i, $j) of a UnitUpperTriangular matrix to a nonzero value ($x)"))
elseif i == j
x == 1 || throw(ArgumentError("cannot set index on the diagonal ($i, $j) of a UnitUpperTriangular matrix to a non-unit value ($x)"))
else
A.data[i,j] = x
end
A.data[i,j] = x
return A
end

function setindex!(A::LowerTriangular, x, i::Integer, j::Integer)
if i < j
throw(BoundsError(A,(i,j)))
x == 0 || throw(ArgumentError("cannot set index in the upper triangular part ($i, $j) of a LowerTriangular matrix to a nonzero value ($x)"))
else
A.data[i,j] = x
end
A.data[i,j] = x
return A
end

function setindex!(A::UnitLowerTriangular, x, i::Integer, j::Integer)
if i <= j
throw(BoundsError(A,(i,j)))
if i < j
x == 0 || throw(ArgumentError("cannot set index in the upper triangular part ($i, $j) of a UnitLowerTriangular matrix to a nonzero value ($x)"))
elseif i == j
x == 1 || throw(ArgumentError("cannot set diagonal index ($i, $j) of a UnitLowerTriangular matrix to a non-unit value ($x)"))
else
A.data[i,j] = x
end
A.data[i,j] = x
return A
end

Expand Down
16 changes: 12 additions & 4 deletions test/linalg/triangular.jl
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,23 @@ for elty1 in (Float32, Float64, Complex64, Complex128, BigFloat, Int)
for i = 1:size(A1, 1)
for j = 1:size(A1, 2)
if uplo1 == :U
if i > j || (i == j && t1 == UnitUpperTriangular)
@test_throws BoundsError A1c[i,j] = 0
if i > j
A1c[i,j] = 0
@test_throws ArgumentError A1c[i,j] = 1
elseif i == j && t1 == UnitUpperTriangular
A1c[i,j] = 1
@test_throws ArgumentError A1c[i,j] = 0
else
A1c[i,j] = 0
@test A1c[i,j] == 0
end
else
if i < j || (i == j && t1 == UnitLowerTriangular)
@test_throws BoundsError A1c[i,j] = 0
if i < j
A1c[i,j] = 0
@test_throws ArgumentError A1c[i,j] = 1
elseif i == j && t1 == UnitLowerTriangular
A1c[i,j] = 1
@test_throws ArgumentError A1c[i,j] = 0
else
A1c[i,j] = 0
@test A1c[i,j] == 0
Expand Down

0 comments on commit fbe97b1

Please sign in to comment.