35 #ifndef _BLAZE_MATH_VIEWS_ROWS_H_ 36 #define _BLAZE_MATH_VIEWS_ROWS_H_ 151 inline decltype(
auto)
rows(
Matrix<MT,SO>& matrix, RRAs... args )
156 return ReturnType( ~matrix, args... );
201 inline decltype(
auto)
rows( const
Matrix<MT,SO>& matrix, RRAs... args )
205 using ReturnType =
const Rows_<
const MT,
index_sequence<I,Is...> >;
206 return ReturnType( ~matrix, args... );
230 inline decltype(
auto)
rows(
Matrix<MT,SO>&& matrix, RRAs... args )
235 return ReturnType( ~matrix, args... );
279 template<
typename MT
283 inline decltype(
auto)
rows(
Matrix<MT,SO>& matrix, T* indices,
size_t n, RRAs... args )
287 using ReturnType = Rows_<MT>;
288 return ReturnType( ~matrix, indices, n, args... );
333 template<
typename MT
337 inline decltype(
auto)
rows( const
Matrix<MT,SO>& matrix, T* indices,
size_t n, RRAs... args )
341 using ReturnType =
const Rows_<const MT>;
342 return ReturnType( ~matrix, indices, n, args... );
362 template<
typename MT
366 inline decltype(
auto)
rows(
Matrix<MT,SO>&& matrix, T* indices,
size_t n, RRAs... args )
370 using ReturnType = Rows_<MT>;
371 return ReturnType( ~matrix, indices, n, args... );
413 template<
typename MT
417 inline decltype(
auto)
rows(
Matrix<MT,SO>& matrix, P p,
size_t n, RRAs... args )
421 using ReturnType = Rows_<MT,P>;
422 return ReturnType( ~matrix, p, n, args... );
465 template<
typename MT
469 inline decltype(
auto)
rows( const
Matrix<MT,SO>& matrix, P p,
size_t n, RRAs... args )
473 using ReturnType =
const Rows_<const MT,P>;
474 return ReturnType( ~matrix, p, n, args... );
494 template<
typename MT
498 inline decltype(
auto)
rows(
Matrix<MT,SO>&& matrix, P p,
size_t n, RRAs... args )
502 using ReturnType = Rows_<MT,P>;
503 return ReturnType( ~matrix, p, n, args... );
545 template<
typename MT
554 return rows<Is...>( std::forward<MT>( matrix ), args... );
595 template<
typename MT
602 return rows( std::forward<MT>( matrix ), indices.begin(), indices.size(), args... );
645 template<
typename MT
649 inline decltype(
auto)
rows( MT&& matrix, const std::array<T,N>& indices, RRAs... args )
653 return rows( std::forward<MT>( matrix ), indices.data(), N, args... );
696 template<
typename MT
699 inline decltype(
auto)
rows( MT&& matrix, const std::vector<T>& indices, RRAs... args )
703 return rows( std::forward<MT>( matrix ), indices.data(), indices.size(), args... );
746 template<
typename MT
750 inline decltype(
auto)
rows( MT&& matrix, const
SmallArray<T,N>& indices, RRAs... args )
754 return rows( std::forward<MT>( matrix ), indices.data(), indices.size(), args... );
775 template<
typename MT
779 inline decltype(
auto)
rows( MT&& matrix, const std::pair<T1,T2>& pair, RRAs... args )
783 return rows( std::forward<MT>( matrix ), pair.first, pair.second, args... );
809 template<
size_t... CRAs
812 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
813 inline decltype(
auto)
rows( const MatMatAddExpr<MT>& matrix, RRAs... args )
817 return rows<CRAs...>( (~matrix).leftOperand(), args... ) +
818 rows<CRAs...>( (~matrix).rightOperand(), args... );
836 template<
size_t... CRAs
839 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
840 inline decltype(
auto)
rows( const MatMatSubExpr<MT>& matrix, RRAs... args )
844 return rows<CRAs...>( (~matrix).leftOperand(), args... ) -
845 rows<CRAs...>( (~matrix).rightOperand(), args... );
863 template<
size_t... CRAs
866 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
867 inline decltype(
auto)
rows( const SchurExpr<MT>& matrix, RRAs... args )
871 return rows<CRAs...>( (~matrix).leftOperand(), args... ) %
872 rows<CRAs...>( (~matrix).rightOperand(), args... );
890 template<
size_t... CRAs
893 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
894 inline decltype(
auto)
rows( const MatMatMultExpr<MT>& matrix, RRAs... args )
898 return rows<CRAs...>( (~matrix).leftOperand(), args... ) * (~matrix).rightOperand();
920 inline decltype(
auto)
rows( const MatMatKronExpr<MT>& matrix, RRAs... args )
924 decltype(
auto) lhs( (~matrix).leftOperand() );
925 decltype(auto) rhs( (~matrix).rightOperand() );
927 const
size_t M( rhs.
rows() );
928 const
size_t N( rhs.
columns() );
930 const auto lhsRows( [M](
size_t i ) {
931 static constexpr
size_t indices[] = { I, Is... };
932 return indices[i] / M;
935 const auto rhsRows( [M](
size_t i ) {
936 static constexpr
size_t indices[] = { I, Is... };
937 return indices[i] % M;
940 const auto lhsColumns( [N](
size_t i ){
return i / N; } );
941 const auto rhsColumns( [N](
size_t i ){
return i % N; } );
943 return columns(
rows( lhs, lhsRows,
sizeof...(Is)+1UL, args... ), lhsColumns, (~matrix).columns(), args... ) %
944 columns(
rows( rhs, rhsRows,
sizeof...(Is)+1UL, args... ), rhsColumns, (~matrix).
columns(), args... );
964 template<
typename MT
967 inline decltype(
auto)
rows( const MatMatKronExpr<MT>& matrix, T* indices,
size_t n, RRAs... args )
971 decltype(
auto) lhs( (~matrix).leftOperand() );
972 decltype(auto) rhs( (~matrix).rightOperand() );
974 const
size_t M( rhs.
rows() );
975 const
size_t N( rhs.
columns() );
977 SmallArray<
size_t,128UL> lhsRows;
978 lhsRows.reserve( n );
980 for(
size_t i=0UL; i<n; ++i ) {
981 lhsRows.pushBack( indices[i] / M );
984 SmallArray<size_t,128UL> rhsRows;
985 rhsRows.reserve( n );
987 for(
size_t i=0UL; i<n; ++i ) {
988 rhsRows.pushBack( indices[i] % M );
991 const auto lhsColumns( [N](
size_t i ){
return i / N; } );
992 const auto rhsColumns( [N](
size_t i ){
return i % N; } );
994 return columns(
rows( lhs, lhsRows, n, args... ), lhsColumns, (~matrix).columns(), args... ) %
995 columns(
rows( rhs, rhsRows, n, args... ), rhsColumns, (~matrix).
columns(), args... );
1015 template<
typename MT
1017 ,
typename... RRAs >
1018 inline decltype(
auto)
rows( const MatMatKronExpr<MT>& matrix, P p,
size_t n, RRAs... args )
1022 decltype(
auto) lhs( (~matrix).leftOperand() );
1023 decltype(auto) rhs( (~matrix).rightOperand() );
1025 const
size_t M( rhs.
rows() );
1026 const
size_t N( rhs.
columns() );
1028 const auto lhsRows( [p,M](
size_t i ) {
return p(i) / M; } );
1029 const auto rhsRows( [p,M](
size_t i ) {
return p(i) % M; } );
1031 const auto lhsColumns( [N](
size_t i ){
return i / N; } );
1032 const auto rhsColumns( [N](
size_t i ){
return i % N; } );
1034 return columns(
rows( lhs, lhsRows, n, args... ), lhsColumns, (~matrix).columns(), args... ) %
1035 columns(
rows( rhs, rhsRows, n, args... ), rhsColumns, (~matrix).
columns(), args... );
1053 template<
size_t... CRAs
1056 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
1057 inline decltype(
auto)
rows( const VecTVecMultExpr<MT>& matrix, RRAs... args )
1061 return elements<CRAs...>( (~matrix).leftOperand(), args... ) * (~matrix).rightOperand();
1079 template<
size_t... CRAs
1082 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
1083 inline decltype(
auto)
rows( const MatScalarMultExpr<MT>& matrix, RRAs... args )
1087 return rows<CRAs...>( (~matrix).leftOperand(), args... ) * (~matrix).rightOperand();
1105 template<
size_t... CRAs
1108 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
1109 inline decltype(
auto)
rows( const MatScalarDivExpr<MT>& matrix, RRAs... args )
1113 return rows<CRAs...>( (~matrix).leftOperand(), args... ) / (~matrix).rightOperand();
1131 template<
size_t... CRAs
1134 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
1135 inline decltype(
auto)
rows( const MatMapExpr<MT>& matrix, RRAs... args )
1139 return map( rows<CRAs...>( (~matrix).operand(), args... ), (~matrix).operation() );
1157 template<
size_t... CRAs
1160 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
1161 inline decltype(
auto)
rows( const MatMatMapExpr<MT>& matrix, RRAs... args )
1165 return map( rows<CRAs...>( (~matrix).leftOperand(), args... ),
1166 rows<CRAs...>( (~matrix).rightOperand(), args... ),
1167 (~matrix).operation() );
1185 template<
size_t... CRAs
1188 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
1189 inline decltype(
auto)
rows( const MatEvalExpr<MT>& matrix, RRAs... args )
1193 return eval( rows<CRAs...>( (~matrix).operand(), args... ) );
1211 template<
size_t... CRAs
1214 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
1215 inline decltype(
auto)
rows( const MatSerialExpr<MT>& matrix, RRAs... args )
1219 return serial( rows<CRAs...>( (~matrix).operand(), args... ) );
1237 template<
size_t... CRAs
1240 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
1241 inline decltype(
auto)
rows( const DeclExpr<MT>& matrix, RRAs... args )
1245 return rows<CRAs...>( (~matrix).operand(), args... );
1263 template<
size_t... CRAs
1266 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) >* =
nullptr >
1267 inline decltype(
auto)
rows( const MatTransExpr<MT>& matrix, RRAs... args )
1271 return trans( columns<CRAs...>( (~matrix).operand(), args... ) );
1289 template<
size_t... CRAs
1294 IsRowMajorMatrix_v<MT> >* =
nullptr >
1295 inline decltype(
auto)
rows( const VecExpandExpr<MT,CEAs...>& matrix, RRAs... args )
1301 return expand<
sizeof...( CRAs ) >( (~matrix).operand() );
1321 template<
typename MT
1325 , EnableIf_t< IsRowMajorMatrix_v<MT> >* =
nullptr >
1326 inline decltype(
auto)
rows( const VecExpandExpr<MT,CEAs...>& matrix, T indices,
size_t n, RRAs... args )
1332 return expand( (~matrix).operand(), n );
1350 template<
size_t... CRAs
1354 ,
EnableIf_t< (
sizeof...( CRAs ) +
sizeof...( RRAs ) > 0UL ) &&
1355 !IsRowMajorMatrix_v<MT> >* =
nullptr >
1356 inline decltype(
auto)
rows( const VecExpandExpr<MT,CEAs...>& matrix, RRAs... args )
1360 return expand<CEAs...>(
elements<CRAs...>( (~matrix).operand(), args... ), (~matrix).expansion() );
1389 , EnableIf_t< IsRows_v< RemoveReference_t<MT> > &&
1390 RemoveReference_t<MT>::compileTimeArgs >* =
nullptr >
1391 inline decltype(
auto)
rows( MT&& r, RRAs... args )
1395 return rows( r.operand(), subsequence<I,Is...>( RemoveReference_t<MT>::idces() ), args... );
1417 , EnableIf_t< IsRows_v< RemoveReference_t<MT> > &&
1418 !RemoveReference_t<MT>::compileTimeArgs >* =
nullptr >
1419 inline decltype(
auto)
rows( MT&& r, RRAs... args )
1426 static constexpr
size_t indices[] = { I, Is... };
1427 for(
size_t i=0UL; i<
sizeof...(Is)+1UL; ++i ) {
1428 if( r.rows() <= indices[i] ) {
1434 return rows( r.operand(), { r.idx(I), r.idx(Is)... }, args... );
1454 template<
typename MT
1457 , EnableIf_t< IsRows_v< RemoveReference_t<MT> > >* =
nullptr >
1458 inline decltype(
auto)
rows( MT&& r, T* indices,
size_t n, RRAs... args )
1465 for(
size_t i=0UL; i<n; ++i ) {
1466 if( r.rows() <= size_t( indices[i] ) ) {
1472 SmallArray<size_t,128UL> newIndices;
1473 newIndices.reserve( n );
1475 for(
size_t i=0UL; i<n; ++i ) {
1476 newIndices.pushBack( r.idx( indices[i] ) );
1479 return rows( r.operand(), newIndices.data(), newIndices.size(), args... );
1499 template<
typename MT
1502 , EnableIf_t< IsRows_v< RemoveReference_t<MT> > && !IsPointer_v<P> >* =
nullptr >
1503 inline decltype(
auto)
rows( MT&& r, P p,
size_t n, RRAs... args )
1510 for(
size_t i=0UL; i<n; ++i ) {
1511 if( r.rows() <= size_t( p(i) ) ) {
1517 SmallArray<size_t,128UL> newIndices;
1518 newIndices.reserve( n );
1520 for(
size_t i=0UL; i<n; ++i ) {
1521 newIndices.pushBack( r.idx( p(i) ) );
1524 return rows( r.operand(), newIndices.data(), newIndices.size(), args... );
1550 template<
size_t... CEAs
1552 ,
typename... REAs >
1553 inline decltype(
auto)
elements( const MatVecMultExpr<VT>& vector, REAs... args )
1557 return rows<CEAs...>( (~vector).leftOperand(), args... ) * (~vector).rightOperand();
1576 template<
size_t... CEAs
1578 ,
typename... REAs >
1579 inline decltype(
auto)
elements( const MatReduceExpr<VT,
rowwise>& vector, REAs... args )
1583 return reduce<rowwise>( rows<CEAs...>( (~vector).operand(), args... ), (~vector).operation() );
1611 , EnableIf_t< IsRows_v< RemoveReference_t<MT> > &&
1612 RemoveReference_t<MT>::compileTimeArgs >* =
nullptr >
1613 inline decltype(
auto)
row( MT&&
rows, RRAs... args )
1617 return row< RemoveReference_t<MT>::idx(I) >(
rows.operand(), args... );
1635 template<
size_t... CRAs
1638 , EnableIf_t< IsRows_v< RemoveReference_t<MT> > &&
1639 (
sizeof...( CRAs ) == 0UL || !RemoveReference_t<MT>::compileTimeArgs ) >* =
nullptr >
1640 inline decltype(
auto)
row( MT&&
rows, RRAs... args )
1644 const RowData<CRAs...> rd( args... );
1649 if(
rows.rows() <= rd.row() ) {
1654 return row(
rows.operand(),
rows.idx( rd.row() ), args... );
1679 template<
size_t... CCAs
1682 , EnableIf_t< IsRows_v< RemoveReference_t<MT> > >* =
nullptr >
1683 inline decltype(
auto)
column( MT&&
rows, RCAs... args )
1687 return elements( column<CCAs...>(
rows.operand(), args... ),
rows.idces() );
1709 template<
typename MT
1713 ,
typename... CRAs >
1714 inline void reset( Rows<MT,SO,DF,SF,CRAs...>&
rows )
1730 template<
typename MT
1734 ,
typename... CRAs >
1735 inline void reset( Rows<MT,SO,DF,SF,CRAs...>&&
rows )
1755 template<
typename MT
1759 ,
typename... CRAs >
1760 inline void reset( Rows<MT,SO,DF,SF,CRAs...>&
rows,
size_t i )
1778 template<
typename MT
1782 ,
typename... CRAs >
1783 inline void clear( Rows<MT,SO,DF,SF,CRAs...>&
rows )
1801 template<
typename MT
1805 ,
typename... CRAs >
1806 inline void clear( Rows<MT,SO,DF,SF,CRAs...>&&
rows )
1844 ,
typename... CRAs >
1845 inline bool isDefault(
const Rows<MT,SO,true,SF,CRAs...>&
rows )
1850 for(
size_t i=0UL; i<
rows.rows(); ++i )
1851 for(
size_t j=0UL; j<
rows.columns(); ++j )
1852 if( !isDefault<RF>(
rows(i,j) ) )
1856 for(
size_t j=0UL; j<
rows.columns(); ++j )
1857 for(
size_t i=0UL; i<
rows.rows(); ++i )
1858 if( !isDefault<RF>(
rows(i,j) ) )
1898 ,
typename... CRAs >
1899 inline bool isDefault(
const Rows<MT,SO,false,SF,CRAs...>&
rows )
1903 for(
size_t i=0UL; i<
rows.rows(); ++i ) {
1904 for(
auto element=
rows.cbegin(i); element!=
rows.cend(i); ++element )
1905 if( !isDefault<RF>( element->value() ) )
return false;
1933 template<
typename MT
1937 ,
typename... CRAs >
1938 inline bool isIntact(
const Rows<MT,SO,DF,SF,CRAs...>&
rows ) noexcept
1940 return (
rows.rows() <=
rows.operand().rows() &&
1941 rows.columns() ==
rows.operand().columns() &&
1961 template<
typename MT
1967 inline bool isSame(
const Rows<MT,SO1,DF,SF,CRAs...>& a,
const Matrix<MT,SO2>& b ) noexcept
1969 if( !
isSame( a.operand(), ~b ) || ( a.rows() != (~b).
rows() ) || ( a.columns() != (~b).
columns() ) )
1972 for(
size_t i=0UL; i<a.rows(); ++i ) {
1996 template<
typename MT
2002 inline bool isSame(
const Matrix<MT,SO1>& a,
const Rows<MT,SO2,DF,SF,CRAs...>& b ) noexcept
2023 template<
typename MT
2031 inline bool isSame(
const Rows<MT,SO1,DF,SF,CRAs...>& a,
const Submatrix<MT,AF,SO2,DF,CSAs...>& b ) noexcept
2033 if( !
isSame( a.operand(), b.operand() ) || ( a.rows() != (~b).
rows() ) || ( a.columns() != (~b).
columns() ) )
2036 for(
size_t i=0UL; i<a.rows(); ++i ) {
2037 if( a.idx(i) != b.row()+i )
2060 template<
typename MT
2067 ,
typename... CRAs >
2068 inline bool isSame(
const Submatrix<MT,AF,SO1,DF,CSAs...>& a,
const Rows<MT,SO2,DF,SF,CRAs...>& b ) noexcept
2089 template<
typename MT
2094 ,
typename... CRAs2 >
2095 inline bool isSame(
const Rows<MT,SO,DF,SF,CRAs1...>& a,
2096 const Rows<MT,SO,DF,SF,CRAs2...>& b ) noexcept
2098 if( !
isSame( a.operand(), b.operand() ) || a.rows() != b.rows() || a.columns() != b.columns() )
2101 for(
size_t i=0UL; i<a.rows(); ++i ) {
2102 if( a.idx(i) != b.idx(i) )
2155 ,
typename... CRAs >
2156 inline auto invert( Rows<MT,SO,true,SF,CRAs...>& r )
2157 -> DisableIf_t< HasMutableDataAccess_v<MT> >
2159 using RT =
ResultType_t< Rows<MT,SO,
true,SF,CRAs...> >;
2188 template<
typename MT
2194 inline bool trySet(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t i,
size_t j,
const ET& value )
2199 return trySet( r.operand(), r.idx(i), j, value );
2223 template<
typename MT
2230 trySet(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
2237 const size_t iend(
row + m );
2239 for(
size_t i=
row; i<iend; ++i ) {
2240 if( !trySet( r.operand(), r.idx(i),
column, 1UL, n, value ) )
2266 template<
typename MT
2272 inline bool tryAdd(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t i,
size_t j,
const ET& value )
2277 return tryAdd( r.operand(), r.idx(i), j, value );
2301 template<
typename MT
2308 tryAdd(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
2315 const size_t iend(
row + m );
2317 for(
size_t i=
row; i<iend; ++i ) {
2318 if( !tryAdd( r.operand(), r.idx(i),
column, 1UL, n, value ) )
2344 template<
typename MT
2350 inline bool trySub(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t i,
size_t j,
const ET& value )
2355 return trySub( r.operand(), r.idx(i), j, value );
2379 template<
typename MT
2386 trySub(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
2393 const size_t iend(
row + m );
2395 for(
size_t i=
row; i<iend; ++i ) {
2396 if( !trySub( r.operand(), r.idx(i),
column, 1UL, n, value ) )
2422 template<
typename MT
2428 inline bool tryMult(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t i,
size_t j,
const ET& value )
2433 return tryMult( r.operand(), r.idx(i), j, value );
2457 template<
typename MT
2464 tryMult(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
2471 const size_t iend(
row + m );
2473 for(
size_t i=
row; i<iend; ++i ) {
2474 if( !tryMult( r.operand(), r.idx(i),
column, 1UL, n, value ) )
2500 template<
typename MT
2506 inline bool tryDiv(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t i,
size_t j,
const ET& value )
2511 return tryDiv( r.operand(), r.idx(i), j, value );
2535 template<
typename MT
2542 tryDiv(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
2549 const size_t iend(
row + m );
2551 for(
size_t i=
row; i<iend; ++i ) {
2552 if( !tryDiv( r.operand(), r.idx(i),
column, 1UL, n, value ) )
2578 template<
typename MT
2582 ,
typename... CRAs >
2583 inline bool tryShift(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t i,
size_t j,
int count )
2588 return tryShift( r.operand(), r.idx(i), j, count );
2612 template<
typename MT
2616 ,
typename... CRAs >
2618 tryShift(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t row,
size_t column,
size_t m,
size_t n,
int count )
2625 const size_t iend(
row + m );
2627 for(
size_t i=
row; i<iend; ++i ) {
2628 if( !tryShift( r.operand(), r.idx(i),
column, 1UL, n, count ) )
2654 template<
typename MT
2660 inline bool tryBitand(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t i,
size_t j,
const ET& value )
2665 return tryBitand( r.operand(), r.idx(i), j, value );
2689 template<
typename MT
2696 tryBitand(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
2703 const size_t iend(
row + m );
2705 for(
size_t i=
row; i<iend; ++i ) {
2706 if( !tryBitand( r.operand(), r.idx(i),
column, 1UL, n, value ) )
2732 template<
typename MT
2738 inline bool tryBitor(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t i,
size_t j,
const ET& value )
2743 return tryBitor( r.operand(), r.idx(i), j, value );
2767 template<
typename MT
2774 tryBitor(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
2781 const size_t iend(
row + m );
2783 for(
size_t i=
row; i<iend; ++i ) {
2784 if( !tryBitor( r.operand(), r.idx(i),
column, 1UL, n, value ) )
2810 template<
typename MT
2816 inline bool tryBitxor(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t i,
size_t j,
const ET& value )
2821 return tryBitxor( r.operand(), r.idx(i), j, value );
2845 template<
typename MT
2852 tryBitxor(
const Rows<MT,SO,DF,SF,CRAs...>& r,
size_t row,
size_t column,
size_t m,
size_t n,
const ET& value )
2859 const size_t iend(
row + m );
2861 for(
size_t i=
row; i<iend; ++i ) {
2862 if( !tryBitxor( r.operand(), r.idx(i),
column, 1UL, n, value ) )
2888 template<
typename MT
2894 inline bool tryAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
2895 const Vector<VT,false>& rhs,
size_t row,
size_t column )
2901 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
2902 if( !trySet( lhs.operand(), lhs.idx(
row+i ),
column, (~rhs)[i] ) )
2928 template<
typename MT
2934 inline bool tryAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
2935 const Vector<VT,true>& rhs,
size_t row,
size_t column )
2941 return tryAssign( lhs.operand(), ~rhs, lhs.idx(
row ),
column );
2964 template<
typename MT
2971 inline bool tryAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
2972 const Vector<VT,TF>& rhs, ptrdiff_t
band,
size_t row,
size_t column )
2981 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
2982 if( !trySet( lhs.operand(), lhs.idx(
row+i ),
column+i, (~rhs)[i] ) )
3008 template<
typename MT1
3015 inline bool tryAssign(
const Rows<MT1,SO1,DF,SF,CRAs...>& lhs,
3016 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
3023 for(
size_t i=0UL; i<(~rhs).
rows(); ++i ) {
3051 template<
typename MT
3057 inline bool tryAddAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3058 const Vector<VT,false>& rhs,
size_t row,
size_t column )
3064 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3065 if( !tryAdd( lhs.operand(), lhs.idx(
row+i ),
column, (~rhs)[i] ) )
3091 template<
typename MT
3097 inline bool tryAddAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3098 const Vector<VT,true>& rhs,
size_t row,
size_t column )
3104 return tryAddAssign( lhs.operand(), ~rhs, lhs.idx(
row ),
column );
3128 template<
typename MT
3135 inline bool tryAddAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3136 const Vector<VT,TF>& rhs, ptrdiff_t
band,
size_t row,
size_t column )
3145 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3146 if( !tryAdd( lhs.operand(), lhs.idx(
row+i ),
column+i, (~rhs)[i] ) )
3172 template<
typename MT1
3179 inline bool tryAddAssign(
const Rows<MT1,SO1,DF,SF,CRAs...>& lhs,
3180 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
3187 for(
size_t i=0UL; i<(~rhs).
rows(); ++i ) {
3215 template<
typename MT
3221 inline bool trySubAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3222 const Vector<VT,false>& rhs,
size_t row,
size_t column )
3228 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3229 if( !trySub( lhs.operand(), lhs.idx(
row+i ),
column, (~rhs)[i] ) )
3256 template<
typename MT
3262 inline bool trySubAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3263 const Vector<VT,true>& rhs,
size_t row,
size_t column )
3269 return trySubAssign( lhs.operand(), ~rhs, lhs.idx(
row ),
column );
3293 template<
typename MT
3300 inline bool trySubAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3301 const Vector<VT,TF>& rhs, ptrdiff_t
band,
size_t row,
size_t column )
3310 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3311 if( !trySub( lhs.operand(), lhs.idx(
row+i ),
column+i, (~rhs)[i] ) )
3337 template<
typename MT1
3344 inline bool trySubAssign(
const Rows<MT1,SO1,DF,SF,CRAs...>& lhs,
3345 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
3352 for(
size_t i=0UL; i<(~rhs).
rows(); ++i ) {
3380 template<
typename MT
3386 inline bool tryMultAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3387 const Vector<VT,false>& rhs,
size_t row,
size_t column )
3393 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3394 if( !tryMult( lhs.operand(), lhs.idx(
row+i ),
column, (~rhs)[i] ) )
3421 template<
typename MT
3427 inline bool tryMultAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3428 const Vector<VT,true>& rhs,
size_t row,
size_t column )
3434 return tryMultAssign( lhs.operand(), ~rhs, lhs.idx(
row ),
column );
3458 template<
typename MT
3465 inline bool tryMultAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3466 const Vector<VT,TF>& rhs, ptrdiff_t
band,
size_t row,
size_t column )
3475 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3476 if( !tryMult( lhs.operand(), lhs.idx(
row+i ),
column+i, (~rhs)[i] ) )
3503 template<
typename MT1
3510 inline bool trySchurAssign(
const Rows<MT1,SO1,DF,SF,CRAs...>& lhs,
3511 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
3518 for(
size_t i=0UL; i<(~rhs).
rows(); ++i ) {
3546 template<
typename MT
3552 inline bool tryDivAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3553 const Vector<VT,false>& rhs,
size_t row,
size_t column )
3559 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3560 if( !tryDiv( lhs.operand(), lhs.idx(
row+i ),
column, (~rhs)[i] ) )
3586 template<
typename MT
3592 inline bool tryDivAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3593 const Vector<VT,true>& rhs,
size_t row,
size_t column )
3599 return tryDivAssign( lhs.operand(), ~rhs, lhs.idx(
row ),
column );
3623 template<
typename MT
3630 inline bool tryDivAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3631 const Vector<VT,TF>& rhs, ptrdiff_t
band,
size_t row,
size_t column )
3640 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3641 if( !tryDiv( lhs.operand(), lhs.idx(
row+i ),
column+i, (~rhs)[i] ) )
3668 template<
typename MT
3674 inline bool tryShiftAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3675 const Vector<VT,false>& rhs,
size_t row,
size_t column )
3681 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3682 if( !tryShift( lhs.operand(), lhs.idx(
row+i ),
column, (~rhs)[i] ) )
3708 template<
typename MT
3714 inline bool tryShiftAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3715 const Vector<VT,true>& rhs,
size_t row,
size_t column )
3721 return tryShiftAssign( lhs.operand(), ~rhs, lhs.idx(
row ),
column );
3745 template<
typename MT
3752 inline bool tryShiftAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3753 const Vector<VT,TF>& rhs, ptrdiff_t
band,
size_t row,
size_t column )
3762 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3763 if( !tryShift( lhs.operand(), lhs.idx(
row+i ),
column+i, (~rhs)[i] ) )
3789 template<
typename MT1
3796 inline bool tryShiftAssign(
const Rows<MT1,SO1,DF,SF,CRAs...>& lhs,
3797 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
3804 for(
size_t i=0UL; i<(~rhs).
rows(); ++i ) {
3832 template<
typename MT
3838 inline bool tryBitandAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3839 const Vector<VT,false>& rhs,
size_t row,
size_t column )
3845 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3846 if( !tryBitand( lhs.operand(), lhs.idx(
row+i ),
column, (~rhs)[i] ) )
3873 template<
typename MT
3879 inline bool tryBitandAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3880 const Vector<VT,true>& rhs,
size_t row,
size_t column )
3886 return tryBitandAssign( lhs.operand(), ~rhs, lhs.idx(
row ),
column );
3910 template<
typename MT
3917 inline bool tryBitandAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
3918 const Vector<VT,TF>& rhs, ptrdiff_t
band,
size_t row,
size_t column )
3927 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
3928 if( !tryBitand( lhs.operand(), lhs.idx(
row+i ),
column+i, (~rhs)[i] ) )
3954 template<
typename MT1
3961 inline bool tryBitandAssign(
const Rows<MT1,SO1,DF,SF,CRAs...>& lhs,
3962 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
3969 for(
size_t i=0UL; i<(~rhs).
rows(); ++i ) {
3997 template<
typename MT
4003 inline bool tryBitorAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
4004 const Vector<VT,false>& rhs,
size_t row,
size_t column )
4010 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
4011 if( !tryBitor( lhs.operand(), lhs.idx(
row+i ),
column, (~rhs)[i] ) )
4038 template<
typename MT
4044 inline bool tryBitorAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
4045 const Vector<VT,true>& rhs,
size_t row,
size_t column )
4051 return tryBitorAssign( lhs.operand(), ~rhs, lhs.idx(
row ),
column );
4075 template<
typename MT
4082 inline bool tryBitorAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
4083 const Vector<VT,TF>& rhs, ptrdiff_t
band,
size_t row,
size_t column )
4092 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
4093 if( !tryBitor( lhs.operand(), lhs.idx(
row+i ),
column+i, (~rhs)[i] ) )
4119 template<
typename MT1
4126 inline bool tryBitorAssign(
const Rows<MT1,SO1,DF,SF,CRAs...>& lhs,
4127 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
4134 for(
size_t i=0UL; i<(~rhs).
rows(); ++i ) {
4162 template<
typename MT
4168 inline bool tryBitxorAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
4169 const Vector<VT,false>& rhs,
size_t row,
size_t column )
4175 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
4176 if( !tryBitxor( lhs.operand(), lhs.idx(
row+i ),
column, (~rhs)[i] ) )
4203 template<
typename MT
4209 inline bool tryBitxorAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
4210 const Vector<VT,true>& rhs,
size_t row,
size_t column )
4216 return tryBitxorAssign( lhs.operand(), ~rhs, lhs.idx(
row ),
column );
4240 template<
typename MT
4247 inline bool tryBitxorAssign(
const Rows<MT,SO,DF,SF,CRAs...>& lhs,
4248 const Vector<VT,TF>& rhs, ptrdiff_t
band,
size_t row,
size_t column )
4257 for(
size_t i=0UL; i<(~rhs).
size(); ++i ) {
4258 if( !tryBitxor( lhs.operand(), lhs.idx(
row+i ),
column+i, (~rhs)[i] ) )
4284 template<
typename MT1
4291 inline bool tryBitxorAssign(
const Rows<MT1,SO1,DF,SF,CRAs...>& lhs,
4292 const Matrix<MT2,SO2>& rhs,
size_t row,
size_t column )
4299 for(
size_t i=0UL; i<(~rhs).
rows(); ++i ) {
4325 template<
typename MT
4329 ,
typename... CRAs >
4330 inline decltype(
auto) derestrict( Rows<MT,SO,DF,SF,CRAs...>& r )
4332 return rows( derestrict( r.operand() ), r.idces(),
unchecked );
4353 template<
typename MT
4357 ,
typename... CRAs >
4358 inline decltype(
auto) derestrict( Rows<MT,SO,DF,SF,CRAs...>&& r )
4360 return rows( derestrict( r.operand() ), r.idces(),
unchecked );
4376 template<
typename MT,
bool SO,
bool DF,
bool SF,
size_t I,
size_t... Is,
typename... CRAs >
4377 struct Size< Rows<MT,SO,DF,SF,index_sequence<I,Is...>,CRAs...>, 0UL >
4381 template<
typename MT,
bool SO,
bool DF,
bool SF,
typename... CRAs >
4382 struct Size< Rows<MT,SO,DF,SF,CRAs...>, 1UL >
4383 :
public Size<MT,1UL>
4399 template<
typename MT,
bool SO,
bool DF,
bool SF,
size_t I,
size_t... Is,
typename... CRAs >
4400 struct MaxSize< Rows<MT,SO,DF,SF,index_sequence<I,Is...>,CRAs...>, 0UL >
4404 template<
typename MT,
bool SO,
bool DF,
bool SF,
typename... CRAs >
4405 struct MaxSize< Rows<MT,SO,DF,SF,CRAs...>, 1UL >
4406 :
public MaxSize<MT,1UL>
4422 template<
typename MT,
bool SO,
bool DF,
bool SF,
typename... CRAs >
4423 struct IsRestricted< Rows<MT,SO,DF,SF,CRAs...> >
4424 :
public IsRestricted<MT>
4440 template<
typename MT,
bool SO,
bool SF,
typename... CRAs >
4441 struct HasConstDataAccess< Rows<MT,SO,true,SF,CRAs...> >
4442 :
public HasConstDataAccess<MT>
4458 template<
typename MT,
bool SO,
bool SF,
typename... CRAs >
4459 struct HasMutableDataAccess< Rows<MT,SO,true,SF,CRAs...> >
4460 :
public HasMutableDataAccess<MT>
4476 template<
typename MT,
bool SO,
bool SF,
typename... CRAs >
4477 struct IsAligned< Rows<MT,SO,true,SF,CRAs...> >
4478 :
public IsAligned<MT>
AlignmentFlag
Alignment flag for (un-)aligned vectors and matrices.Via these flags it is possible to specify subvec...
Definition: AlignmentFlag.h:62
Rows specialization for sparse matrices.
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.This macro encapsulates the default way o...
Definition: Exception.h:235
Header file for auxiliary alias declarations.
decltype(auto) column(Matrix< MT, SO > &matrix, RCAs... args)
Creating a view on a specific column of the given matrix.
Definition: Column.h:133
Header file for the blaze::checked and blaze::unchecked instances.
Header file for the implementation of the RowData class template.
Header file for the alignment flag values.
#define BLAZE_CONSTRAINT_MUST_HAVE_MUTABLE_DATA_ACCESS(T)
Constraint on the data type.In case the given data type T does not provide low-level data access to m...
Definition: MutableDataAccess.h:61
bool isSame(const Matrix< MT1, SO1 > &a, const Matrix< MT2, SO2 > &b) noexcept
Returns whether the two given matrices represent the same observable state.
Definition: Matrix.h:992
Header file for basic type definitions.
IntegralConstant< ptrdiff_t, N > Ptrdiff_t
Compile time integral constant wrapper for ptrdiff_t.The Ptrdiff_t alias template represents an integ...
Definition: IntegralConstant.h:237
Header file for the MatReduceExpr base class.
typename T::ResultType ResultType_t
Alias declaration for nested ResultType type definitions.The ResultType_t alias declaration provides ...
Definition: Aliases.h:390
Header file for the serial shim.
Header file for the MatTransExpr base class.
Header file for the dense matrix inversion flags.
void reset(const DiagonalProxy< MT > &proxy)
Resetting the represented element to the default initial values.
Definition: DiagonalProxy.h:595
constexpr Unchecked unchecked
Global Unchecked instance.The blaze::unchecked instance is an optional token for the creation of view...
Definition: Check.h:138
Header file for the MatEvalExpr base class.
Header file for the MAYBE_UNUSED function template.
Header file for the MatMatMultExpr base class.
Header file for the extended initializer_list functionality.
Index sequence type of the Blaze library.
Header file for the MaxSize type trait.
constexpr size_t columns(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of columns of the matrix.
Definition: Matrix.h:514
Header file for the MatMatKronExpr base class.
Header file for the matrix storage order types.
typename EnableIf< Condition, T >::Type EnableIf_t
Auxiliary type for the EnableIf class template.The EnableIf_t alias declaration provides a convenient...
Definition: EnableIf.h:138
void invert(const HermitianProxy< MT > &proxy)
In-place inversion of the represented element.
Definition: HermitianProxy.h:779
Header file for the MatMapExpr base class.
Header file for the DisableIf class template.
Header file for the SmallArray implementation.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:58
#define BLAZE_ALWAYS_INLINE
Platform dependent setup of an enforced inline keyword.
Definition: Inline.h:85
Header file for the IsRows type trait.
Implementation of a dynamic array with small array optimization.The SmallArray class template is a hy...
Definition: SmallArray.h:81
Header file for the MatMatSubExpr base class.
constexpr bool Contains_v
Auxiliary variable template for the Contains type trait.The Contains_v variable template provides a c...
Definition: Contains.h:138
constexpr void MAYBE_UNUSED(const Args &...)
Suppression of unused parameter warnings.
Definition: MaybeUnused.h:81
Header file for the IsAligned type trait.
decltype(auto) eval(const DenseMatrix< MT, SO > &dm)
Forces the evaluation of the given dense matrix expression dm.
Definition: DMatEvalExpr.h:786
decltype(auto) elements(Vector< VT, TF > &vector, REAs... args)
Creating a view on a selection of elements of the given vector.
Definition: Elements.h:139
Header file for the exception macros of the math module.
Constraint on the data type.
Constraint on the data type.
Header file for the MatSerialExpr base class.
Header file for the VecTVecMultExpr base class.
Header file for the EnableIf class template.
void clear(const DiagonalProxy< MT > &proxy)
Clearing the represented element.
Definition: DiagonalProxy.h:615
decltype(auto) band(Matrix< MT, SO > &matrix, RBAs... args)
Creating a view on a specific band of the given matrix.
Definition: Band.h:137
Header file for the HasConstDataAccess type trait.
Header file for the DeclExpr base class.
Header file for the Matrix base class.
Header file for the MatScalarMultExpr base class.
Header file for run time assertion macros.
Header file for the Unique class template.
Check< false > Unchecked
Type of the blaze::unchecked instance.blaze::Unchecked is the type of the blaze::unchecked instance,...
Definition: Check.h:96
Header file for the SchurExpr base class.
decltype(auto) expand(const DenseVector< VT, TF > &dv, size_t expansion)
Expansion of the given dense vector.
Definition: DVecExpandExpr.h:739
decltype(auto) row(Matrix< MT, SO > &, RRAs...)
Creating a view on a specific row of the given matrix.
Definition: Row.h:133
Header file for the IsPointer type trait.
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:94
Header file for the isDefault shim.
constexpr size_t size(const Matrix< MT, SO > &matrix) noexcept
Returns the total number of elements of the matrix.
Definition: Matrix.h:530
Base class for matrices.The Matrix class is a base class for all dense and sparse matrix classes with...
Definition: Forward.h:114
Header file for the integer_sequence and index_sequence aliases.
decltype(auto) serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:808
Header file for the HasMutableDataAccess type trait.
#define BLAZE_CONSTRAINT_MUST_NOT_REQUIRE_EVALUATION(T)
Constraint on the data type.In case the given data type T requires an intermediate evaluation within ...
Definition: RequiresEvaluation.h:81
Header file for the MatMatAddExpr base class.
constexpr size_t rows(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of rows of the matrix.
Definition: Matrix.h:498
Header file for the RemoveReference type trait.
decltype(auto) trans(const DenseMatrix< MT, SO > &dm)
Calculation of the transpose of the given dense matrix.
Definition: DMatTransExpr.h:765
Header file for the VecExpandExpr base class.
constexpr size_t rowwise
Reduction flag for row-wise reduction operations.
Definition: ReductionFlag.h:70
Header file for the IsRowMajorMatrix type trait.
Header file for the MatMatMapExpr base class.
Initializer list type of the Blaze library.
Header file for all forward declarations for views.
Header file for the IntegralConstant class template.
bool isIntact(const DiagonalMatrix< MT, SO, DF > &m)
Returns whether the invariants of the given diagonal matrix are intact.
Definition: DiagonalMatrix.h:264
Rows specialization for dense matrices.
bool isDefault(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is in default state.
Definition: DiagonalProxy.h:635
Header file for the MatScalarDivExpr base class.
Header file for the MatVecMultExpr base class.
Header file for the implementation of the Rows base template.
Header file for the IsRestricted type trait.
Header file for the Size type trait.
InversionFlag
Inversion flag.The InversionFlag type enumeration represents the different types of matrix inversion ...
Definition: InversionFlag.h:101
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression,...
Definition: Assert.h:101
Header file for the reduction flags.
Header file for the function trace functionality.
decltype(auto) map(const DenseMatrix< MT1, SO > &lhs, const DenseMatrix< MT2, SO > &rhs, OP op)
Evaluates the given binary operation on each single element of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1121