@@ -87,6 +87,8 @@ op_rank::apply_diag(uword& out, Mat<eT>& A, typename get_pod_type<eT>::result to
8787
8888 typedef typename get_pod_type<eT>::result T;
8989
90+ out = uword (0 );
91+
9092 const uword N = (std::min)(A.n_rows , A.n_cols );
9193
9294 podarray<T> diag_abs_vals (N);
@@ -98,7 +100,7 @@ op_rank::apply_diag(uword& out, Mat<eT>& A, typename get_pod_type<eT>::result to
98100 const eT Aii = A.at (i,i);
99101 const T abs_Aii = std::abs (Aii);
100102
101- if (arma_isnan (Aii)) { out = uword ( 0 ); return false ; }
103+ if (arma_isnan (Aii)) { return false ; }
102104
103105 diag_abs_vals[i] = abs_Aii;
104106
@@ -108,6 +110,8 @@ op_rank::apply_diag(uword& out, Mat<eT>& A, typename get_pod_type<eT>::result to
108110 // set tolerance to default if it hasn't been specified
109111 if (tol == T (0 )) { tol = (std::max)(A.n_rows , A.n_cols ) * max_abs_Aii * std::numeric_limits<T>::epsilon (); }
110112
113+ if (arma_isnan (tol)) { return false ; }
114+
111115 uword count = 0 ;
112116
113117 for (uword i=0 ; i<N; ++i) { count += (diag_abs_vals[i] > tol) ? uword (1 ) : uword (0 ); }
@@ -128,18 +132,20 @@ op_rank::apply_sym(uword& out, Mat<eT>& A, typename get_pod_type<eT>::result tol
128132
129133 typedef typename get_pod_type<eT>::result T;
130134
131- if (A.is_square () == false ) { out = uword (0 ); return false ; }
135+ out = uword (0 );
136+
137+ if (A.is_square () == false ) { return false ; }
132138
133139 Col<T> v;
134140
135141 const bool status = auxlib::eig_sym (v, A);
136142
137- if (status == false ) { out = uword ( 0 ); return false ; }
143+ if (status == false ) { return false ; }
138144
139145 const uword v_n_elem = v.n_elem ;
140146 T* v_mem = v.memptr ();
141147
142- if (v_n_elem == 0 ) { out = uword ( 0 ); return true ; }
148+ if (v_n_elem == 0 ) { return true ; }
143149
144150 T max_abs_v = T (0 );
145151
@@ -148,6 +154,8 @@ op_rank::apply_sym(uword& out, Mat<eT>& A, typename get_pod_type<eT>::result tol
148154 // set tolerance to default if it hasn't been specified
149155 if (tol == T (0 )) { tol = (std::max)(A.n_rows , A.n_cols ) * max_abs_v * std::numeric_limits<T>::epsilon (); }
150156
157+ if (arma_isnan (tol)) { return false ; }
158+
151159 uword count = 0 ;
152160
153161 for (uword i=0 ; i < v_n_elem; ++i) { count += (v_mem[i] > tol) ? uword (1 ) : uword (0 ); }
@@ -168,20 +176,24 @@ op_rank::apply_gen(uword& out, Mat<eT>& A, typename get_pod_type<eT>::result tol
168176
169177 typedef typename get_pod_type<eT>::result T;
170178
179+ out = uword (0 );
180+
171181 Col<T> s;
172182
173183 const bool status = auxlib::svd_dc (s, A);
174184
175- if (status == false ) { out = uword ( 0 ); return false ; }
185+ if (status == false ) { return false ; }
176186
177187 const uword s_n_elem = s.n_elem ;
178188 const T* s_mem = s.memptr ();
179189
180- if (s_n_elem == 0 ) { out = uword ( 0 ); return true ; }
190+ if (s_n_elem == 0 ) { return true ; }
181191
182192 // set tolerance to default if it hasn't been specified
183193 if (tol == T (0 )) { tol = (std::max)(A.n_rows , A.n_cols ) * s_mem[0 ] * std::numeric_limits<T>::epsilon (); }
184194
195+ if (arma_isnan (tol)) { return false ; }
196+
185197 uword count = 0 ;
186198
187199 for (uword i=0 ; i < s_n_elem; ++i) { count += (s_mem[i] > tol) ? uword (1 ) : uword (0 ); }
0 commit comments