@@ -267,10 +267,23 @@ Broadcast.broadcast_preserving_zero_d(f, tvs::Union{Number,TransposeAbsVec}...)
267
267
268
268
# # multiplication *
269
269
270
+ function _dot_nonrecursive (u, v)
271
+ lu = length (u)
272
+ if lu != length (v)
273
+ throw (DimensionMismatch (" first array has length $(lu) which does not match the length of the second, $(length (v)) ." ))
274
+ end
275
+ if lu == 0
276
+ zero (eltype (u)) * zero (eltype (v))
277
+ else
278
+ sum (uu* vv for (uu, vv) in zip (u, v))
279
+ end
280
+ end
281
+
270
282
# Adjoint/Transpose-vector * vector
271
- * (u:: AdjointAbsVec{T } , v:: AbstractVector{T} ) where {T <: Number } = dot (u. parent, v)
283
+ * (u:: AdjointAbsVec{<:Number } , v:: AbstractVector{<:Number} ) = dot (u. parent, v)
272
284
* (u:: TransposeAbsVec{T} , v:: AbstractVector{T} ) where {T<: Real } = dot (u. parent, v)
273
- * (u:: AdjOrTransAbsVec , v:: AbstractVector ) = sum (uu* vv for (uu, vv) in zip (u, v))
285
+ * (u:: AdjOrTransAbsVec , v:: AbstractVector ) = _dot_nonrecursive (u, v)
286
+
274
287
275
288
# vector * Adjoint/Transpose-vector
276
289
* (u:: AbstractVector , v:: AdjOrTransAbsVec ) = broadcast (* , u, v)
@@ -281,14 +294,10 @@ Broadcast.broadcast_preserving_zero_d(f, tvs::Union{Number,TransposeAbsVec}...)
281
294
282
295
# AdjOrTransAbsVec{<:Any,<:AdjOrTransAbsVec} is a lazy conj vectors
283
296
# We need to expand the combinations to avoid ambiguities
284
- (* )(u:: TransposeAbsVec , v:: AdjointAbsVec{<:Any,<:TransposeAbsVec} ) =
285
- sum (uu* vv for (uu, vv) in zip (u, v))
286
- (* )(u:: AdjointAbsVec , v:: AdjointAbsVec{<:Any,<:TransposeAbsVec} ) =
287
- sum (uu* vv for (uu, vv) in zip (u, v))
288
- (* )(u:: TransposeAbsVec , v:: TransposeAbsVec{<:Any,<:AdjointAbsVec} ) =
289
- sum (uu* vv for (uu, vv) in zip (u, v))
290
- (* )(u:: AdjointAbsVec , v:: TransposeAbsVec{<:Any,<:AdjointAbsVec} ) =
291
- sum (uu* vv for (uu, vv) in zip (u, v))
297
+ (* )(u:: TransposeAbsVec , v:: AdjointAbsVec{<:Any,<:TransposeAbsVec} ) = _dot_nonrecursive (u, v)
298
+ (* )(u:: AdjointAbsVec , v:: AdjointAbsVec{<:Any,<:TransposeAbsVec} ) = _dot_nonrecursive (u, v)
299
+ (* )(u:: TransposeAbsVec , v:: TransposeAbsVec{<:Any,<:AdjointAbsVec} ) = _dot_nonrecursive (u, v)
300
+ (* )(u:: AdjointAbsVec , v:: TransposeAbsVec{<:Any,<:AdjointAbsVec} ) = _dot_nonrecursive (u, v)
292
301
293
302
# # pseudoinversion
294
303
pinv (v:: AdjointAbsVec , tol:: Real = 0 ) = pinv (v. parent, tol). parent
0 commit comments