From d5760f310ccdf7aeb8b30ad6fe5973da10c6b1d2 Mon Sep 17 00:00:00 2001 From: conrad Date: Mon, 9 May 2022 14:56:37 +1000 Subject: [PATCH] more efficient handling of aliasing in default case --- include/armadillo_bits/glue_solve_meat.hpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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; }