@@ -78,12 +78,26 @@ function checkzerobands(dest, f, A::AbstractMatrix)
78
78
l, u = bandwidths (A)
79
79
80
80
if ! (d_l >= l && d_u >= u)
81
- for j = rowsupport (A)
82
- for k = max (1 ,j- u) : min (j- d_u- 1 ,m)
83
- iszero (f (A[k,j])) || throw (BandError (dest,j- k))
81
+ if d_l >= l
82
+ for j = rowsupport (A)
83
+ for k = max (1 ,j- u) : min (j- d_u- 1 ,m)
84
+ iszero (f (A[k,j])) || throw (BandError (dest,j- k))
85
+ end
84
86
end
85
- for k = max (1 ,j+ d_l+ 1 ) : min (j+ l,m)
86
- iszero (f (A[k,j])) || throw (BandError (dest,j- k))
87
+ elseif d_u >= u
88
+ for j = rowsupport (A)
89
+ for k = max (1 ,j+ d_l+ 1 ) : min (j+ l,m)
90
+ iszero (f (A[k,j])) || throw (BandError (dest,j- k))
91
+ end
92
+ end
93
+ else
94
+ for j = rowsupport (A)
95
+ for k = max (1 ,j- u) : min (j- d_u- 1 ,m)
96
+ iszero (f (A[k,j])) || throw (BandError (dest,j- k))
97
+ end
98
+ for k = max (1 ,j+ d_l+ 1 ) : min (j+ l,m)
99
+ iszero (f (A[k,j])) || throw (BandError (dest,j- k))
100
+ end
87
101
end
88
102
end
89
103
end
@@ -693,12 +707,29 @@ function checkzerobands(dest, f, (A,B)::NTuple{2,AbstractMatrix})
693
707
694
708
rspA = rowsupport (A)
695
709
rspB = rowsupport (B)
696
- for j = min (first (rspA), first (rspB)): max (last (rspA), last (rspB))
697
- for k = max (1 ,j- u) : min (j- d_u- 1 ,m)
698
- iszero (f (A[k,j], B[k,j])) || throw (BandError (dest,b))
699
- end
700
- for k = max (1 ,j+ d_l+ 1 ) : min (j+ l,m)
701
- iszero (f (A[k,j], B[k,j])) || throw (BandError (dest,b))
710
+ # if the dest has more bands both above and below the diagonal, no checks are necessary
711
+ if ! (u <= d_u && l <= d_l)
712
+ if u <= d_u # the dest has more bands above the diagonal, so we only check below
713
+ for j = min (first (rspA), first (rspB)): max (last (rspA), last (rspB))
714
+ for k = max (1 ,j+ d_l+ 1 ) : min (j+ l,m)
715
+ iszero (f (A[k,j], B[k,j])) || throw (BandError (dest,j- k))
716
+ end
717
+ end
718
+ elseif l <= d_l # the dest has more bands below the diagonal, so we only check above
719
+ for j = min (first (rspA), first (rspB)): max (last (rspA), last (rspB))
720
+ for k = max (1 ,j- u) : min (j- d_u- 1 ,m)
721
+ iszero (f (A[k,j], B[k,j])) || throw (BandError (dest,j- k))
722
+ end
723
+ end
724
+ else # check both above and below the diagonal
725
+ for j = min (first (rspA), first (rspB)): max (last (rspA), last (rspB))
726
+ for k = max (1 ,j- u) : min (j- d_u- 1 ,m)
727
+ iszero (f (A[k,j], B[k,j])) || throw (BandError (dest,j- k))
728
+ end
729
+ for k = max (1 ,j+ d_l+ 1 ) : min (j+ l,m)
730
+ iszero (f (A[k,j], B[k,j])) || throw (BandError (dest,j- k))
731
+ end
732
+ end
702
733
end
703
734
end
704
735
end
@@ -727,9 +758,8 @@ function _banded_broadcast!(dest::AbstractMatrix, f, (A,B)::NTuple{2,AbstractMat
727
758
if (d_l,d_u) == (A_l,A_u) == (B_l,B_u)
728
759
data_d .= f .(data_A,data_B)
729
760
else
730
- max_l,max_u = max (A_l,B_l,d_l),max (A_u,B_u,d_u)
731
- min_l,min_u = min (A_l,B_l,d_l),min (A_u,B_u,d_u)
732
761
checkzerobands (dest, f, (A,B))
762
+ min_l,min_u = min (A_l,B_l,d_l),min (A_u,B_u,d_u)
733
763
734
764
# fill extra bands in dest
735
765
fill! (view (data_d,1 : d_u- max (A_u,B_u),:), z)
0 commit comments