14void PCA::reserve(
const std::size_t& n) { data.reserve(n); }
16void PCA::insert(
const std::vector<float>& x)
18 data.insert(data.end(), x.begin(), x.end());
22void PCA::fit(
const std::size_t& n_components)
26 std::size_t cols = data.size() / rows;
27 assert(n_components <= cols);
29 auto X = Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>(data.data(), rows,
33 X = X.rowwise() - X.colwise().mean();
36 if (rows < n_components)
38 Eigen::JacobiSVD<Eigen::MatrixXf> svd(X, Eigen::ComputeFullV);
41 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> U =
42 (X * svd.matrixV()).leftCols(n_components);
45 principal_components.assign(U.data(), U.data() + U.size());
49 Eigen::JacobiSVD<Eigen::MatrixXf> svd(X, Eigen::ComputeThinV);
52 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> U =
53 (X * svd.matrixV()).leftCols(n_components);
56 principal_components.assign(U.data(), U.data() + U.size());
62std::vector<float> PCA::getPrincipalComponents(
const std::size_t& i)
66 const std::size_t n_components = principal_components.size() / rows;
67 const std::size_t idx = i * n_components;
68 std::vector<float> result(principal_components.data() + idx, principal_components.data() + idx + n_components);
75 principal_components.clear();
80void PCA::toCSV(
const std::string& filename)
82 std::ofstream f(filename);
86 std::size_t cols = data.size() / rows;
87 for (std::size_t row = 0; row < rows; ++row)
89 for (std::size_t col = 0; col < cols; ++col)
90 f << data[row * cols + col] <<
",";
96 DBG(
"failed to open csv file");
Definition AirAbsorptionFilter.cpp:2