42 static constexpr int rank = 10;
47 static constexpr bool scale =
false;
159 template<
typename Data_,
typename Index_>
161 const tatami::Matrix<Data_, Index_>* mat,
162 const irlba::Irlba& irb,
163 Eigen::MatrixXd& pcs,
164 Eigen::MatrixXd& rotation,
165 Eigen::VectorXd& variance_explained,
166 Eigen::VectorXd& center_v,
167 Eigen::VectorXd& scale_v,
170 auto extracted = pca_utils::extract_sparse_for_pca(mat, nthreads);
171 pca_utils::SparseMatrix emat(mat->ncol(), mat->nrow(), std::move(extracted.values), std::move(extracted.indices), std::move(extracted.ptrs), nthreads);
173 size_t ngenes = emat.cols();
174 center_v.resize(ngenes);
175 scale_v.resize(ngenes);
176 pca_utils::compute_mean_and_variance_from_sparse_matrix(emat, center_v, scale_v, nthreads);
177 total_var = pca_utils::process_scale_vector(scale, scale_v);
179 irlba::Centered<
decltype(emat)> centered(&emat, ¢er_v);
181 irlba::Scaled<
decltype(centered)> scaled(¢ered, &scale_v);
182 irb.run(scaled, pcs, rotation, variance_explained);
184 irb.run(centered, pcs, rotation, variance_explained);
188 template<
typename Data_,
typename Index_>
190 const tatami::Matrix<Data_, Index_>* mat,
191 const irlba::Irlba& irb,
192 Eigen::MatrixXd& pcs,
193 Eigen::MatrixXd& rotation,
194 Eigen::VectorXd& variance_explained,
195 Eigen::VectorXd& center_v,
196 Eigen::VectorXd& scale_v,
199 auto emat = pca_utils::extract_dense_for_pca(mat, nthreads);
201 size_t ngenes = emat.cols();
202 center_v.resize(ngenes);
203 scale_v.resize(ngenes);
204 pca_utils::compute_mean_and_variance_from_dense_matrix(emat, center_v, scale_v, nthreads);
205 total_var = pca_utils::process_scale_vector(scale, scale_v);
208 pca_utils::apply_center_and_scale_to_dense_matrix(emat, center_v, scale, scale_v, nthreads);
209 irb.run(emat, pcs, rotation, variance_explained);
212 template<
typename Data_,
typename Index_>
214 const tatami::Matrix<Data_, Index_>* mat,
215 Eigen::MatrixXd& pcs,
216 Eigen::MatrixXd& rotation,
217 Eigen::VectorXd& variance_explained,
218 Eigen::VectorXd& center_v,
219 Eigen::VectorXd& scale_v,
222 irlba::EigenThreadScope t(nthreads);
224 irb.set_number(rank);
225 irb.set_cap_number(
true);
228 run_sparse(mat, irb, pcs, rotation, variance_explained, center_v, scale_v, total_var);
230 run_dense(mat, irb, pcs, rotation, variance_explained, center_v, scale_v, total_var);
233 pca_utils::clean_up(mat->ncol(), pcs, variance_explained);
235 pcs.adjointInPlace();
300 template<
typename T,
typename IDX>
304 Eigen::MatrixXd rotation;
305 Eigen::VectorXd center, scale;
309 if (return_rotation) {
310 output.
rotation = std::move(rotation);
313 output.
center = std::move(center);
316 output.
scale = std::move(scale);
338 template<
typename T,
typename IDX,
typename X>
339 Results run(
const tatami::Matrix<T, IDX>* mat,
const X* features)
const {
343 auto subsetted = pca_utils::subset_matrix_by_features(mat, features);
344 return run(subsetted.get());