Skip to content

Commit 2148fa4

Browse files
committed
Fix scaling block unit triangular matrices
1 parent ea8e858 commit 2148fa4

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
lines changed

src/triangular.jl

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,6 +1323,15 @@ end
13231323
# Generic routines #
13241324
####################
13251325

1326+
function _set_diag!(B::UpperOrLowerTriangular, x)
1327+
# get a mutable array to modify the diagonal
1328+
Bm = parent(B) isa StridedArray ? B : copy!(similar(B), B)
1329+
for i in diagind(Bm.data, IndexStyle(Bm.data))
1330+
Bm.data[i] = x
1331+
end
1332+
Bm
1333+
end
1334+
13261335
for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13271336
(LowerTriangular, UnitLowerTriangular))
13281337
tstrided = t{<:Any, <:StridedMaybeAdjOrTransMat}
@@ -1336,10 +1345,7 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13361345

13371346
function (*)(A::$unitt, x::Number)
13381347
B = $t(A.data)*x
1339-
for i in axes(A, 1)
1340-
B.data[i,i] = x
1341-
end
1342-
return B
1348+
_set_diag!(B, oneunit(eltype(A)) * x)
13431349
end
13441350

13451351
(*)(x::Number, A::$t) = $t(x*A.data)
@@ -1351,10 +1357,7 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13511357

13521358
function (*)(x::Number, A::$unitt)
13531359
B = x*$t(A.data)
1354-
for i in axes(A, 1)
1355-
B.data[i,i] = x
1356-
end
1357-
return B
1360+
_set_diag!(B, x * oneunit(eltype(A)))
13581361
end
13591362

13601363
(/)(A::$t, x::Number) = $t(A.data/x)
@@ -1366,11 +1369,7 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13661369

13671370
function (/)(A::$unitt, x::Number)
13681371
B = $t(A.data)/x
1369-
invx = inv(x)
1370-
for i in axes(A, 1)
1371-
B.data[i,i] = invx
1372-
end
1373-
return B
1372+
_set_diag!(B, oneunit(eltype(A)) / x)
13741373
end
13751374

13761375
(\)(x::Number, A::$t) = $t(x\A.data)
@@ -1382,11 +1381,7 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13821381

13831382
function (\)(x::Number, A::$unitt)
13841383
B = x\$t(A.data)
1385-
invx = inv(x)
1386-
for i in axes(A, 1)
1387-
B.data[i,i] = invx
1388-
end
1389-
return B
1384+
_set_diag!(B, x \ oneunit(eltype(A)))
13901385
end
13911386
end
13921387
end

test/triangular.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,4 +934,14 @@ end
934934
end
935935
end
936936

937+
@testset "block unit triangular scaling" begin
938+
m = SizedArrays.SizedArray{(2,2)}([1 2; 3 4])
939+
U = UnitUpperTriangular(fill(m, 4, 4))
940+
M = Matrix{eltype(U)}(U)
941+
@test U/2 == M/2
942+
@test 2\U == 2\M
943+
@test U*2 == M*2
944+
@test 2*U == 2*M
945+
end
946+
937947
end # module TestTriangular

0 commit comments

Comments
 (0)