7 #ifndef SPECTRA_ORTHOGONALIZATION_H
8 #define SPECTRA_ORTHOGONALIZATION_H
20 template <
typename Matrix>
23 assert(in_output.cols() > left_cols_to_skip &&
"left_cols_to_skip is larger than columns of matrix");
24 assert(left_cols_to_skip >= 0 &&
"left_cols_to_skip is negative");
32 template <
typename Matrix>
35 if (left_cols_to_skip == 0)
37 in_output.col(0).normalize();
38 left_cols_to_skip = 1;
40 return left_cols_to_skip;
45 template <
typename Matrix>
52 InternalMatrix
I = InternalMatrix::Identity(nrows, ncols);
54 in_output.leftCols(ncols).noalias() =
qr.householderQ() *
I;
60 template <
typename Matrix>
66 for (
Eigen::Index k = left_cols_to_skip; k < in_output.cols(); ++k)
70 in_output.col(k) -= in_output.col(
j).dot(in_output.col(k)) * in_output.col(
j);
72 in_output.col(k).normalize();
79 template <
typename Matrix>
87 in_output.col(
j) -= in_output.leftCols(
j) * (in_output.leftCols(
j).transpose() * in_output.col(
j));
88 in_output.col(
j).normalize();
98 template <
typename Matrix>
102 if (left_cols_to_skip == 0)
107 Eigen::Index right_cols_to_ortho = in_output.cols() - left_cols_to_skip;
108 in_output.rightCols(right_cols_to_ortho) -= in_output.leftCols(left_cols_to_skip) *
109 (in_output.leftCols(left_cols_to_skip).transpose() * in_output.rightCols(right_cols_to_ortho));
118 template <
typename Matrix>
123 Eigen::Index right_cols_to_ortho = in_output.cols() - left_cols_to_skip;
132 template <
typename Matrix>
141 #endif // SPECTRA_ORTHOGONALIZATION_H