From ff12815d21222c795b9842ff1b1b8af6193c4af3 Mon Sep 17 00:00:00 2001 From: Nicola Vigano <nicola.vigano@esrf.fr> Date: Tue, 30 May 2017 19:21:26 +0200 Subject: [PATCH] Eigenvalues and Eigenvectors of 3x3 symm matrices, added degeneracy handling Signed-off-by: Nicola Vigano <nicola.vigano@esrf.fr> --- zUtil_Maths/gtMathsEig3x3SymmPosDef.m | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/zUtil_Maths/gtMathsEig3x3SymmPosDef.m b/zUtil_Maths/gtMathsEig3x3SymmPosDef.m index 037d4c2a..5839d708 100644 --- a/zUtil_Maths/gtMathsEig3x3SymmPosDef.m +++ b/zUtil_Maths/gtMathsEig3x3SymmPosDef.m @@ -1,4 +1,7 @@ -function [e, V] = gtMathsEig3x3SymmPosDef(M) +function [e, V] = gtMathsEig3x3SymmPosDef(M, toll_deg) + if (~exist('toll_deg', 'var') || isempty(toll_deg)) + toll_deg = 1e5; + end num_matrs = size(M, 3); e = zeros(1, 3, num_matrs, class(M)); @@ -47,6 +50,8 @@ function [e, V] = gtMathsEig3x3SymmPosDef(M) e(1, 2, others) = q_3 - e(1, 1, others) - e(1, 3, others); end + e = abs(e); + V = zeros(3, 3, num_matrs, 'like', M); M23M12 = M(2, 3, :) .* M(1, 2, :); @@ -59,6 +64,15 @@ function [e, V] = gtMathsEig3x3SymmPosDef(M) V(2, :, :) = bsxfun(@minus, bsxfun(@times, M(2, 3, :), M11), M12M13); V(3, :, :) = bsxfun(@minus, M12_2, M11 .* M22); + % Let's take care of the degeneracies + deg_12 = abs(e(1, 1, :) - e(1, 2, :)) < toll_deg; + deg_13 = abs(e(1, 1, :) - e(1, 3, :)) < toll_deg; + deg_23 = abs(e(1, 2, :) - e(1, 3, :)) < toll_deg; + + V(:, 2, deg_12) = gtMathsCross(V(:, 1, deg_12), V(:, 3, deg_12), 1); + V(:, 3, deg_13) = gtMathsCross(V(:, 1, deg_13), V(:, 2, deg_13), 1); + V(:, 3, deg_23) = gtMathsCross(V(:, 1, deg_23), V(:, 2, deg_23), 1); + norm_V = sqrt(sum(V .^ 2, 1)); norm_V = 1 ./ (norm_V + (norm_V == 0)); V = bsxfun(@times, V, norm_V); -- GitLab