22 #ifndef _BLAZE_MATH_EXPRESSIONS_TSMATTSMATADDEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TSMATTSMATADDEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
66 template<
typename MT1
74 typedef typename MT1::ResultType
RT1;
75 typedef typename MT2::ResultType
RT2;
76 typedef typename MT1::ReturnType
RN1;
77 typedef typename MT2::ReturnType
RN2;
78 typedef typename MT1::CompositeType
CT1;
79 typedef typename MT2::CompositeType
CT2;
167 return lhs_.columns();
177 return lhs_.nonZeros() +
rhs_.nonZeros();
188 return lhs_.nonZeros(i) +
rhs_.nonZeros(i);
218 template<
typename T >
246 template<
typename MT
253 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
269 for(
size_t j=0UL; j<(~lhs).
columns(); ++j ) {
270 const RightIterator end( B.end(j) );
271 for( RightIterator element=B.begin(j); element!=end; ++element ) {
272 if(
isDefault( (~lhs)(element->index(),j) ) )
273 (~lhs)(element->index(),j) = element->value();
275 (~lhs)(element->index(),j) += element->value();
296 template<
typename MT >
302 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
303 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
315 const size_t m( rhs.
rows() );
316 const size_t n( rhs.
columns() );
319 std::vector<size_t> nonzeros( m, 0UL );
320 for(
size_t j=0UL; j<n; ++j )
322 const LeftIterator lend( A.end(j) );
323 const RightIterator rend( B.end(j) );
325 LeftIterator l( A.begin(j) );
326 RightIterator r( B.begin(j) );
328 while( l != lend && r != rend )
330 if( l->index() < r->index() ) {
331 ++nonzeros[l->index()];
334 else if( l->index() > r->index() ) {
335 ++nonzeros[r->index()];
339 ++nonzeros[l->index()];
346 ++nonzeros[l->index()];
351 ++nonzeros[r->index()];
357 for(
size_t i=0UL; i<m; ++i ) {
358 (~lhs).reserve( i, nonzeros[i] );
362 for(
size_t j=0UL; j<n; ++j )
364 const LeftIterator lend( A.end(j) );
365 const RightIterator rend( B.end(j) );
367 LeftIterator l( A.begin(j) );
368 RightIterator r( B.begin(j) );
370 while( l != lend && r != rend )
372 if( l->index() < r->index() ) {
373 (~lhs).append( l->index(), j, l->value() );
376 else if( l->index() > r->index() ) {
377 (~lhs).append( r->index(), j, r->value() );
381 (~lhs).append( l->index(), j, l->value()+r->value() );
388 (~lhs).append( l->index(), j, l->value() );
393 (~lhs).append( r->index(), j, r->value() );
414 template<
typename MT >
420 typedef typename boost::remove_reference<CT1>::type::ConstIterator LeftIterator;
421 typedef typename boost::remove_reference<CT2>::type::ConstIterator RightIterator;
433 for(
size_t j=0UL; j<(~lhs).
columns(); ++j )
435 const LeftIterator lend( A.end(j) );
436 const RightIterator rend( B.end(j) );
438 LeftIterator l( A.begin(j) );
439 RightIterator r( B.begin(j) );
440 size_t nonzeros( A.nonZeros(j) + B.nonZeros(j) );
442 for( ; l!=lend && r!=rend; ++l ) {
443 while( r->index() < l->index() && ++r != rend ) {}
444 if( r!=rend && l->index() == r->index() ) {
452 (~lhs).reserve( j, nonzeros );
457 while( l != lend && r != rend )
459 if( l->index() < r->index() ) {
460 (~lhs).append( l->index(), j, l->value() );
463 else if( l->index() > r->index() ) {
464 (~lhs).append( r->index(), j, r->value() );
468 (~lhs).append( l->index(), j, l->value()+r->value() );
475 (~lhs).append( l->index(), j, l->value() );
480 (~lhs).append( r->index(), j, r->value() );
501 template<
typename MT
531 template<
typename MT
602 template<
typename T1
608 throw std::invalid_argument(
"Matrix sizes do not match" );