diff --git a/include/armadillo_bits/glue_solve_meat.hpp b/include/armadillo_bits/glue_solve_meat.hpp index d429558d..54adfa8b 100644 --- a/include/armadillo_bits/glue_solve_meat.hpp +++ b/include/armadillo_bits/glue_solve_meat.hpp @@ -117,7 +117,18 @@ glue_solve_gen_full::apply(Mat& actual_out, const Base& A_expr, const arma_debug_check( (fast && refine ), "solve(): options 'fast' and 'refine' are mutually exclusive" ); arma_debug_check( (no_sympd && likely_sympd), "solve(): options 'no_sympd' and 'likely_sympd' are mutually exclusive" ); - Mat out; + bool is_alias = true; + + if(is_Mat::value && is_Mat::value) + { + const quasi_unwrap UA( A_expr.get_ref() ); + const quasi_unwrap UB( B_expr.get_ref() ); + + if( (UA.is_alias(actual_out) == false) && (UB.is_alias(actual_out) == false) ) { is_alias = false; } + } + + Mat tmp; + Mat& out = (is_alias) ? tmp : actual_out; Mat A = A_expr.get_ref(); @@ -329,7 +340,7 @@ glue_solve_gen_full::apply(Mat& actual_out, const Base& A_expr, const status = auxlib::solve_approx_svd(out, A, B_expr.get_ref()); // A is overwritten } - actual_out.steal_mem(out); + if(is_alias) { actual_out.steal_mem(out); } return status; }