@@ -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+
13261335for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13271336 (LowerTriangular, UnitLowerTriangular))
13281337 tstrided = t{<: Any , <: StridedMaybeAdjOrTransMat }
@@ -1335,8 +1344,8 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13351344 end
13361345
13371346 function (* )(A:: $unitt , x:: Number )
1338- B = copy! ( similar ( $ t (A. data)), A)
1339- B * x
1347+ B = $ t (A. data)* x
1348+ _set_diag! (B, oneunit ( eltype (A)) * x)
13401349 end
13411350
13421351 (* )(x:: Number , A:: $t ) = $ t (x* A. data)
@@ -1347,8 +1356,8 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13471356 end
13481357
13491358 function (* )(x:: Number , A:: $unitt )
1350- B = copy! ( similar ( $ t (A. data)), A )
1351- x * B
1359+ B = x * $ t (A. data)
1360+ _set_diag! (B, x * oneunit ( eltype (A)))
13521361 end
13531362
13541363 (/ )(A:: $t , x:: Number ) = $ t (A. data/ x)
@@ -1359,8 +1368,8 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13591368 end
13601369
13611370 function (/ )(A:: $unitt , x:: Number )
1362- B = copy! ( similar ( $ t (A. data)), A)
1363- B / x
1371+ B = $ t (A. data)/ x
1372+ _set_diag! (B, oneunit ( eltype (A)) / x)
13641373 end
13651374
13661375 (\ )(x:: Number , A:: $t ) = $ t (x\ A. data)
@@ -1371,8 +1380,8 @@ for (t, unitt) in ((UpperTriangular, UnitUpperTriangular),
13711380 end
13721381
13731382 function (\ )(x:: Number , A:: $unitt )
1374- B = copy! ( similar ( $ t (A. data)), A )
1375- x \ B
1383+ B = x \ $ t (A. data)
1384+ _set_diag! (B, x \ oneunit ( eltype (A)))
13761385 end
13771386 end
13781387end
0 commit comments