diff --git a/brew/vecfit.m b/brew/vecfit.m index f4840a5..09cd42b 100644 --- a/brew/vecfit.m +++ b/brew/vecfit.m @@ -22,41 +22,43 @@ ## Author: Jens ## Created: 2023-06-10 -function [P1, na_1, D] = vecfit (Pp, ignore_mask, Pt, P0, na_0, step) +function [P1, na_1, D] = vecfit (Pp, element_mask, Pt, P0, na_0, step) [N_subst, N_elem] = size(Pp); - # Create default ignore_mask - if isempty(ignore_mask), - ignore_mask = ones(1,N_elem); + # Create default element_mask + if isempty(element_mask), + element_mask = ones(1,N_elem); end # A-Priory state with mask - P1 = P0 + sum(Pp.*na_0.*ignore_mask); + P1 = P0 + sum(Pp.*na_0.*element_mask); # Calc distance to target d = (Pt-P1); D = norm(d); dn = d/D; - subst_list = 1:N_subst; - + # Enable all substances + subst_mask = ones(1, N_subst); while 1, # Find best prototype best_i = 0; best_k = 10000; best_dir = 1; - for i=subst_list, - p = Pp(i,:); - pn = p/norm(p); + for i=1:N_subst, + if subst_mask(i) == 1 + p = Pp(i,:); + pn = p/norm(p); - # compare d and p - for vecdir=[1,-1], - k = norm(vecdir*pn - dn); - if k < best_k, - best_k = k; - best_i = i; - best_dir = vecdir; + # compare d and p + for vecdir=[1,-1], + k = norm(vecdir*pn - dn); + if k < best_k, + best_k = k; + best_i = i; + best_dir = vecdir; + end end end end @@ -75,7 +77,7 @@ function [P1, na_1, D] = vecfit (Pp, ignore_mask, Pt, P0, na_0, step) # Check for negative n accu = na_1(best_i) + delta; if accu < 0, - subst_list(best_i) = []; + subst_mask(best_i) = 0; continue; end # Update point @@ -83,6 +85,9 @@ function [P1, na_1, D] = vecfit (Pp, ignore_mask, Pt, P0, na_0, step) # Update Point accu na_1(best_i) = accu; + + # Re-enable substance + subst_mask = ones(1, N_subst); break; end end