All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TSVecSVecMultExpr.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_EXPRESSIONS_TSVECSVECMULTEXPR_H_
36 #define _BLAZE_MATH_EXPRESSIONS_TSVECSVECMULTEXPR_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <stdexcept>
49 #include <blaze/util/Types.h>
51 
52 
53 namespace blaze {
54 
55 //=================================================================================================
56 //
57 // GLOBAL BINARY ARITHMETIC OPERATORS
58 //
59 //=================================================================================================
60 
61 //*************************************************************************************************
89 template< typename T1 // Type of the left-hand side sparse vector
90  , typename T2 > // Type of the right-hand side sparse vector
91 inline const typename MultTrait<typename T1::ElementType,typename T2::ElementType>::Type
93 {
95 
96  typedef typename T1::CompositeType Lhs; // Composite type of the left-hand side sparse vector expression
97  typedef typename T2::CompositeType Rhs; // Composite type of the right-hand side sparse vector expression
98  typedef typename RemoveReference<Lhs>::Type X1; // Auxiliary type for the left-hand side composite type
99  typedef typename RemoveReference<Rhs>::Type X2; // Auxiliary type for the right-hand side composite type
100  typedef typename X1::ElementType E1; // Element type of the left-hand side sparse vector expression
101  typedef typename X2::ElementType E2; // Element type of the right-hand side sparse vector expression
102  typedef typename MultTrait<E1,E2>::Type MultType; // Multiplication result type
103  typedef typename X1::ConstIterator LeftIterator; // Iterator type of the left-hand sparse vector expression
104  typedef typename X2::ConstIterator RightIterator; // Iterator type of the right-hand sparse vector expression
105 
110 
111  if( (~lhs).size() != (~rhs).size() )
112  throw std::invalid_argument( "Vector sizes do not match" );
113 
114  if( (~lhs).nonZeros() == 0UL || (~rhs).nonZeros() == 0UL ) return MultType();
115 
116  Lhs left ( ~lhs );
117  Rhs right( ~rhs );
118  const LeftIterator lend( left.end() );
119  const RightIterator rend( right.end() );
120  LeftIterator l( left.begin() );
121  RightIterator r( right.begin() );
122  MultType sp = MultType();
123 
124  for( ; l!=lend && r!=rend; ++l ) {
125  while( r->index() < l->index() && ++r != rend ) {}
126  if( r!=rend && l->index() == r->index() ) {
127  sp = l->value() * r->value();
128  ++r;
129  break;
130  }
131  }
132 
133  for( ; l!=lend && r!=rend; ++l ) {
134  while( r->index() < l->index() && ++r != rend ) {}
135  if( r!=rend && l->index() == r->index() ) {
136  sp += l->value() * r->value();
137  ++r;
138  }
139  }
140 
141  return sp;
142 }
143 //*************************************************************************************************
144 
145 } // namespace blaze
146 
147 #endif
const DMatDMatMultExpr< T1, T2 > operator*(const DenseMatrix< T1, false > &lhs, const DenseMatrix< T2, false > &rhs)
Multiplication operator for the multiplication of two row-major dense matrices ( ).
Definition: DMatDMatMultExpr.h:4075
Header file for the SparseVector base class.
#define BLAZE_CONSTRAINT_MUST_BE_COLUMN_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a column dense or sparse vector type...
Definition: TransposeFlag.h:159
const This & CompositeType
Data type for composite expression templates.
Definition: CompressedMatrix.h:2384
Header file for the multiplication trait.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2388
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a sparse, N-dimensional vector type...
Definition: SparseVector.h:79
Constraint on the data type.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2382
Constraint on the data type.
Removal of reference modifiers.The RemoveCV type trait removes any reference modifiers from the given...
Definition: RemoveReference.h:69
Base template for the MultTrait class.
Definition: MultTrait.h:141
Header file for the RemoveReference type trait.
Base class for sparse vectors.The SparseVector class is a base class for all arbitrarily sized (N-dim...
Definition: Forward.h:105
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:157
Header file for basic type definitions.
#define BLAZE_CONSTRAINT_MUST_BE_ROW_VECTOR_TYPE(T)
Constraint on the data type.In case the given data type T is not a row dense or sparse vector type (i...
Definition: TransposeFlag.h:81
Header file for the FunctionTrace class.