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
61template <typename TMatrixU, typename TMatrixV>
62void
63CanonicalizeColumnSignsPaired(TMatrixU & u, TMatrixV & paired)
64{
65 // u and paired share a column count but may differ in row count (an SVD's
66 // thin U is rows x k, V is cols x k), so each is flipped over its own rows.
67 const unsigned int uRows = u.rows();
68 const unsigned int pairedRows = paired.rows();
69 for (unsigned int j = 0; j < u.cols(); ++j)
70 {
71 unsigned int pivot = 0;
72 for (unsigned int i = 1; i < uRows; ++i)
73 {
74 if (std::abs(u(i, j)) > std::abs(u(pivot, j)))
75 {
76 pivot = i;
77 }
78 }
79 if (u(pivot, j) < typename TMatrixU::element_type{ 0 })
80 {
81 for (unsigned int i = 0; i < uRows; ++i)
82 {
83 u(i, j) = -u(i, j);
84 }
85 for (unsigned int i = 0; i < pairedRows; ++i)
86 {
87 paired(i, j) = -paired(i, j);
88 }
89 }
90 }
91}
92
93} // namespace itk::detail
94
95#endif // itkEigenDecompositionSignConvention_h
void CanonicalizeColumnSignsPaired(TMatrixU &u, TMatrixV &paired)
void CanonicalizeEigenvectorColumnSigns(vnl_matrix< T > &V)