Skip to content

Commit c723c59

Browse files
authored
Scaling for partly initialized unit triangular (#1351)
After this, scaling unit triangular matrices with parents that don't have the diagonal initialized works. ```julia julia> M = Matrix{BigFloat}(undef,2,2); julia> M[1,2] = 3; julia> U = UnitUpperTriangular(M) 2×2 UnitUpperTriangular{BigFloat, Matrix{BigFloat}}: 1.0 3.0 ⋅ 1.0 julia> U * 2 2×2 UpperTriangular{BigFloat, Matrix{BigFloat}}: 2.0 6.0 ⋅ 2.0 ``` Probably needs #1350 for tests to pass.
1 parent 91ef00e commit c723c59

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
lines changed

src/triangular.jl

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,15 +1324,6 @@ end
13241324
# Generic routines #
13251325
####################
13261326

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

13471338
function (*)(A::$unitt, x::Number)
1348-
B = $t(A.data)*x
1349-
_set_diag!(B, oneunit(eltype(A)) * x)
1339+
B = copy!(similar($t(A.data)), A)
1340+
B * x
13501341
end
13511342

13521343
(*)(x::Number, A::$t) = $t(x*A.data)
@@ -1357,8 +1348,8 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13571348
end
13581349

13591350
function (*)(x::Number, A::$unitt)
1360-
B = x*$t(A.data)
1361-
_set_diag!(B, x * oneunit(eltype(A)))
1351+
B = copy!(similar($t(A.data)), A)
1352+
x * B
13621353
end
13631354

13641355
(/)(A::$t, x::Number) = $t(A.data/x)
@@ -1369,8 +1360,8 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13691360
end
13701361

13711362
function (/)(A::$unitt, x::Number)
1372-
B = $t(A.data)/x
1373-
_set_diag!(B, oneunit(eltype(A)) / x)
1363+
B = copy!(similar($t(A.data)), A)
1364+
B / x
13741365
end
13751366

13761367
(\)(x::Number, A::$t) = $t(x\A.data)
@@ -1381,8 +1372,8 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13811372
end
13821373

13831374
function (\)(x::Number, A::$unitt)
1384-
B = x\$t(A.data)
1385-
_set_diag!(B, x \ oneunit(eltype(A)))
1375+
B = copy!(similar($t(A.data)), A)
1376+
x \ B
13861377
end
13871378
end
13881379
end

test/triangular.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -955,4 +955,18 @@ end
955955
@test 2*U == 2*M
956956
end
957957

958+
@testset "scaling partly initialized unit triangular" begin
959+
for T in (UnitUpperTriangular, UnitLowerTriangular)
960+
isupper = T == UnitUpperTriangular
961+
M = Matrix{BigFloat}(undef,2,2)
962+
M[1+!isupper, 1+isupper] = 3
963+
U = T(M)
964+
C = Matrix(U)
965+
@test U * 2 == C * 2
966+
@test 2 * U == 2 * C
967+
@test U / 2 == C / 2
968+
@test 2 \ U == 2 \ C
969+
end
970+
end
971+
958972
end # module TestTriangular

0 commit comments

Comments
 (0)