ITK 6.0.0
Insight Toolkit
 
Loading...
Searching...
No Matches
itkEigenDecompositionSignConvention.h
Go to the documentation of this file.
1/*=========================================================================
2 *
3 * Copyright NumFOCUS
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0.txt
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *=========================================================================*/
18#ifndef itkEigenDecompositionSignConvention_h
19#define itkEigenDecompositionSignConvention_h
20
21#include "vnl/vnl_matrix.h"
22#include <cmath>
23
24namespace itk::detail
25{
26
32template <typename T>
33void
35{
36 const unsigned int rows = V.rows();
37 for (unsigned int j = 0; j < V.cols(); ++j)
38 {
39 unsigned int pivot = 0;
40 for (unsigned int i = 1; i < rows; ++i)
41 {
42 if (std::abs(V(i, j)) > std::abs(V(pivot, j)))
43 {
44 pivot = i;
45 }
46 }
47 if (V(pivot, j) < T{ 0 })
48 {
49 V.scale_column(j, T{ -1 });
50 }
51 }
52}
53
60template <typename TMatrix>
61void
62CanonicalizeColumnSignsPaired(TMatrix & u, TMatrix & paired)
63{
64 // u and paired share a column count but may differ in row count (an SVD's
65 // thin U is rows x k, V is cols x k), so each is flipped over its own rows.
66 const unsigned int uRows = u.rows();
67 const unsigned int pairedRows = paired.rows();
68 for (unsigned int j = 0; j < u.cols(); ++j)
69 {
70 unsigned int pivot = 0;
71 for (unsigned int i = 1; i < uRows; ++i)
72 {
73 if (std::abs(u(i, j)) > std::abs(u(pivot, j)))
74 {
75 pivot = i;
76 }
77 }
78 if (u(pivot, j) < typename TMatrix::element_type{ 0 })
79 {
80 for (unsigned int i = 0; i < uRows; ++i)
81 {
82 u(i, j) = -u(i, j);
83 }
84 for (unsigned int i = 0; i < pairedRows; ++i)
85 {
86 paired(i, j) = -paired(i, j);
87 }
88 }
89 }
90}
91
92} // namespace itk::detail
93
94#endif // itkEigenDecompositionSignConvention_h
void CanonicalizeColumnSignsPaired(TMatrix &u, TMatrix &paired)
void CanonicalizeEigenvectorColumnSigns(vnl_matrix< T > &V)