Skip to content

Commit 150e2fd

Browse files
committed
Fix scaling block unit triangular matrices
(cherry picked from commit 2148fa4)
1 parent aba980c commit 150e2fd

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
@@ -1270,6 +1270,15 @@ end
12701270
# Generic routines #
12711271
####################
12721272

1273+
function _set_diag!(B::UpperOrLowerTriangular, x)
1274+
# get a mutable array to modify the diagonal
1275+
Bm = parent(B) isa StridedArray ? B : copy!(similar(B), B)
1276+
for i in diagind(Bm.data, IndexStyle(Bm.data))
1277+
Bm.data[i] = x
1278+
end
1279+
Bm
1280+
end
1281+
12731282
for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
12741283
(LowerTriangular, UnitLowerTriangular))
12751284
tstrided = t{<:Any, <:StridedMaybeAdjOrTransMat}
@@ -1283,10 +1292,7 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
12831292

12841293
function (*)(A::$unitt, x::Number)
12851294
B = $t(A.data)*x
1286-
for i in axes(A, 1)
1287-
B.data[i,i] = x
1288-
end
1289-
return B
1295+
_set_diag!(B, oneunit(eltype(A)) * x)
12901296
end
12911297

12921298
(*)(x::Number, A::$t) = $t(x*A.data)
@@ -1298,10 +1304,7 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
12981304

12991305
function (*)(x::Number, A::$unitt)
13001306
B = x*$t(A.data)
1301-
for i in axes(A, 1)
1302-
B.data[i,i] = x
1303-
end
1304-
return B
1307+
_set_diag!(B, x * oneunit(eltype(A)))
13051308
end
13061309

13071310
(/)(A::$t, x::Number) = $t(A.data/x)
@@ -1313,11 +1316,7 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13131316

13141317
function (/)(A::$unitt, x::Number)
13151318
B = $t(A.data)/x
1316-
invx = inv(x)
1317-
for i in axes(A, 1)
1318-
B.data[i,i] = invx
1319-
end
1320-
return B
1319+
_set_diag!(B, oneunit(eltype(A)) / x)
13211320
end
13221321

13231322
(\)(x::Number, A::$t) = $t(x\A.data)
@@ -1329,11 +1328,7 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13291328

13301329
function (\)(x::Number, A::$unitt)
13311330
B = x\$t(A.data)
1332-
invx = inv(x)
1333-
for i in axes(A, 1)
1334-
B.data[i,i] = invx
1335-
end
1336-
return B
1331+
_set_diag!(B, x \ oneunit(eltype(A)))
13371332
end
13381333
end
13391334
end

test/triangular.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,4 +923,14 @@ end
923923
end
924924
end
925925

926+
@testset "block unit triangular scaling" begin
927+
m = SizedArrays.SizedArray{(2,2)}([1 2; 3 4])
928+
U = UnitUpperTriangular(fill(m, 4, 4))
929+
M = Matrix{eltype(U)}(U)
930+
@test U/2 == M/2
931+
@test 2\U == 2\M
932+
@test U*2 == M*2
933+
@test 2*U == 2*M
934+
end
935+
926936
end # module TestTriangular

0 commit comments

Comments
 (0)