56std::pair<bool, int>
pca(
57 const InputEigenMatrix_& matrix,
61 OutputEigenMatrix_& scores,
62 OutputEigenMatrix_& rotation,
63 EigenVector_& variances,
66 const Eigen::Index nr = matrix.rows();
67 const Eigen::Index nc = matrix.cols();
72 throw std::runtime_error(
"cannot center with no observations");
80 throw std::runtime_error(
"cannot scale with fewer than two observations");
85 if (center || scale) {
87 for (Eigen::Index i = 0; i < nc; ++i) {
88 buffer = matrix.col(i);
90 typename EigenVector_::Scalar mean = 0;
92 mean = buffer.sum() / nr;
97 typename EigenVector_::Scalar var = 0;
98 for (
const auto x : buffer) {
99 var += (x - mean) * (x - mean);
103 scale0[i] = std::sqrt(var/(nr - 1));
113 std::unique_ptr<Matrix<EigenVector_, OutputEigenMatrix_> > ptr;
114 ptr.reset(
new SimpleMatrix<EigenVector_, OutputEigenMatrix_, I<
decltype(&matrix)> >(&matrix));
117 std::unique_ptr<Matrix<EigenVector_, OutputEigenMatrix_> > alt;
118 alt.reset(
new CenteredMatrix<EigenVector_, OutputEigenMatrix_, I<
decltype(ptr)>, I<
decltype(¢er0)> >(std::move(ptr), ¢er0));
123 std::unique_ptr<Matrix<EigenVector_, OutputEigenMatrix_> > alt;
124 alt.reset(
new ScaledMatrix<EigenVector_, OutputEigenMatrix_, I<
decltype(ptr)>, I<
decltype(&scale0)> >(std::move(ptr), &scale0,
true,
true));
128 const auto stats =
compute(*ptr, number, scores, rotation, variances, options);
130 scores.array().rowwise() *= variances.adjoint().array();
132 const auto denom = nr - 1;
133 for (
auto& v : variances) {
197template<
class OutputEigenMatrix_ = Eigen::MatrixXd,
class EigenVector_ = Eigen::VectorXd,
class InputEigenMatrix_>
std::pair< bool, int > pca(const InputEigenMatrix_ &matrix, bool center, bool scale, Eigen::Index number, OutputEigenMatrix_ &scores, OutputEigenMatrix_ &rotation, EigenVector_ &variances, const Options< EigenVector_ > &options)
Definition pca.hpp:56
std::pair< bool, int > compute(const Matrix_ &matrix, const Eigen::Index number, EigenMatrix_ &outU, EigenMatrix_ &outV, EigenVector_ &outD, const Options< EigenVector_ > &options)
Definition compute.hpp:142