@@ -121,20 +121,6 @@ op_accu_mat::apply(const T1& X)
121121 return arrayops::accumulate (U.M .memptr (), U.M .n_elem );
122122 }
123123
124- if (is_subview_row<T1>::value)
125- {
126- typedef typename T1::elem_type eT;
127-
128- const subview_row<eT>& sv = reinterpret_cast < const subview_row<eT>& >(X);
129-
130- if (sv.m .n_rows == 1 )
131- {
132- const eT* sv_mem = &(sv.m .at (sv.aux_col1 ));
133-
134- return arrayops::accumulate (sv_mem, sv.n_elem );
135- }
136- }
137-
138124 const Proxy<T1> P (X);
139125
140126 return (Proxy<T1>::use_at) ? op_accu_mat::apply_proxy_at (P) : op_accu_mat::apply_proxy_linear (P);
@@ -616,19 +602,7 @@ op_accu_mat::apply(const subview<eT>& X)
616602 const uword X_n_rows = X.n_rows ;
617603 const uword X_n_cols = X.n_cols ;
618604
619- if (X_n_rows == 1 )
620- {
621- const Mat<eT>& m = X.m ;
622-
623- const uword col_offset = X.aux_col1 ;
624- const uword row_offset = X.aux_row1 ;
625-
626- eT val = eT (0 );
627-
628- for (uword i=0 ; i < X_n_cols; ++i) { val += m.at (row_offset, col_offset + i); }
629-
630- return val;
631- }
605+ if (X_n_rows == 1 ) { return op_accu_mat::apply ( static_cast < const subview_row<eT>& >(X) ); }
632606
633607 if (X_n_cols == 1 ) { return arrayops::accumulate ( X.colptr (0 ), X_n_rows ); }
634608
@@ -656,6 +630,39 @@ op_accu_mat::apply(const subview_col<eT>& X)
656630
657631
658632
633+ template <typename eT>
634+ inline
635+ eT
636+ op_accu_mat::apply (const subview_row<eT>& X)
637+ {
638+ arma_debug_sigprint ();
639+
640+ const uword X_m_n_rows = X.m .n_rows ;
641+ const uword X_n_cols = X.n_cols ;
642+
643+ const eT* row_mem = &(X.m .at (X.aux_row1 ,X.aux_col1 ));
644+
645+ eT val1 = eT (0 );
646+ eT val2 = eT (0 );
647+
648+ uword j;
649+
650+ for (j=1 ; j < X_n_cols; j+=2 )
651+ {
652+ val1 += (*row_mem); row_mem += X_m_n_rows;
653+ val2 += (*row_mem); row_mem += X_m_n_rows;
654+ }
655+
656+ if ((j-1 ) < X_n_cols)
657+ {
658+ val1 += (*row_mem);
659+ }
660+
661+ return val1 + val2;
662+ }
663+
664+
665+
659666//
660667
661668
0 commit comments