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>
 
   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