@@ -426,13 +426,17 @@ end
426
426
427
427
const BandedMatrix = Union{Bidiagonal,Diagonal,Tridiagonal,SymTridiagonal} # or BiDiTriSym
428
428
const BiTriSym = Union{Bidiagonal,Tridiagonal,SymTridiagonal}
429
+ const TriSym = Union{Tridiagonal,SymTridiagonal}
429
430
const BiTri = Union{Bidiagonal,Tridiagonal}
430
431
@inline mul! (C:: AbstractVector , A:: BandedMatrix , B:: AbstractVector , alpha:: Number , beta:: Number ) = _mul! (C, A, B, MulAddMul (alpha, beta))
431
432
@inline mul! (C:: AbstractMatrix , A:: BandedMatrix , B:: AbstractVector , alpha:: Number , beta:: Number ) = _mul! (C, A, B, MulAddMul (alpha, beta))
432
433
@inline mul! (C:: AbstractMatrix , A:: BandedMatrix , B:: AbstractMatrix , alpha:: Number , beta:: Number ) = _mul! (C, A, B, MulAddMul (alpha, beta))
433
434
@inline mul! (C:: AbstractMatrix , A:: AbstractMatrix , B:: BandedMatrix , alpha:: Number , beta:: Number ) = _mul! (C, A, B, MulAddMul (alpha, beta))
434
435
@inline mul! (C:: AbstractMatrix , A:: BandedMatrix , B:: BandedMatrix , alpha:: Number , beta:: Number ) = _mul! (C, A, B, MulAddMul (alpha, beta))
435
436
437
+ lmul! (A:: Bidiagonal , B:: AbstractVecOrMat ) = @inline _mul! (B, A, B, MulAddMul ())
438
+ rmul! (B:: AbstractMatrix , A:: Bidiagonal ) = @inline _mul! (B, B, A, MulAddMul ())
439
+
436
440
function check_A_mul_B!_sizes (C, A, B)
437
441
mA, nA = size (A)
438
442
mB, nB = size (B)
@@ -460,7 +464,11 @@ function _diag(A::Bidiagonal, k)
460
464
end
461
465
end
462
466
463
- function _mul! (C:: AbstractMatrix , A:: BiTriSym , B:: BiTriSym , _add:: MulAddMul = MulAddMul ())
467
+ _mul! (C:: AbstractMatrix , A:: BiTriSym , B:: TriSym , _add:: MulAddMul = MulAddMul ()) =
468
+ _bibimul! (C, A, B, _add)
469
+ _mul! (C:: AbstractMatrix , A:: BiTriSym , B:: Bidiagonal , _add:: MulAddMul = MulAddMul ()) =
470
+ _bibimul! (C, A, B, _add)
471
+ function _bibimul! (C, A, B, _add)
464
472
check_A_mul_B!_sizes (C, A, B)
465
473
n = size (A,1 )
466
474
n <= 3 && return mul! (C, Array (A), Array (B), _add. alpha, _add. beta)
@@ -583,7 +591,7 @@ function _mul!(C::AbstractVecOrMat, A::BiTriSym, B::AbstractVecOrMat, _add::MulA
583
591
C
584
592
end
585
593
586
- function _mul! (C:: AbstractMatrix , A:: AbstractMatrix , B:: BiTriSym , _add:: MulAddMul = MulAddMul ())
594
+ function _mul! (C:: AbstractMatrix , A:: AbstractMatrix , B:: TriSym , _add:: MulAddMul = MulAddMul ())
587
595
require_one_based_indexing (C, A)
588
596
check_A_mul_B!_sizes (C, A, B)
589
597
iszero (_add. alpha) && return _rmul_or_fill! (C, _add. beta)
@@ -618,7 +626,37 @@ function _mul!(C::AbstractMatrix, A::AbstractMatrix, B::BiTriSym, _add::MulAddMu
618
626
C
619
627
end
620
628
621
- function _mul! (C:: AbstractMatrix , A:: Diagonal , B:: BiTriSym , _add:: MulAddMul = MulAddMul ())
629
+ function _mul! (C:: AbstractMatrix , A:: AbstractMatrix , B:: Bidiagonal , _add:: MulAddMul = MulAddMul ())
630
+ require_one_based_indexing (C, A)
631
+ check_A_mul_B!_sizes (C, A, B)
632
+ iszero (_add. alpha) && return _rmul_or_fill! (C, _add. beta)
633
+ if size (A, 1 ) <= 3 || size (B, 2 ) <= 1
634
+ return mul! (C, Array (A), Array (B), _add. alpha, _add. beta)
635
+ end
636
+ m, n = size (A)
637
+ @inbounds if B. uplo == ' U'
638
+ for i in 1 : m
639
+ for j in n: - 1 : 2
640
+ _modify! (_add, A[i,j] * B. dv[j] + A[i,j- 1 ] * B. ev[j- 1 ], C, (i, j))
641
+ end
642
+ _modify! (_add, A[i,1 ] * B. dv[1 ], C, (i, 1 ))
643
+ end
644
+ else # uplo == 'L'
645
+ for i in 1 : m
646
+ for j in 1 : n- 1
647
+ _modify! (_add, A[i,j] * B. dv[j] + A[i,j+ 1 ] * B. ev[j], C, (i, j))
648
+ end
649
+ _modify! (_add, A[i,n] * B. dv[n], C, (i, n))
650
+ end
651
+ end
652
+ C
653
+ end
654
+
655
+ _mul! (C:: AbstractMatrix , A:: Diagonal , B:: Bidiagonal , _add:: MulAddMul = MulAddMul ()) =
656
+ _dibimul! (C, A, B, _add)
657
+ _mul! (C:: AbstractMatrix , A:: Diagonal , B:: TriSym , _add:: MulAddMul = MulAddMul ()) =
658
+ _dibimul! (C, A, B, _add)
659
+ function _dibimul! (C, A, B, _add)
622
660
require_one_based_indexing (C)
623
661
check_A_mul_B!_sizes (C, A, B)
624
662
n = size (A,1 )
0 commit comments