diff --git a/src/shogun/preprocessor/PCA.cpp b/src/shogun/preprocessor/PCA.cpp index a2d6a0dedbb..6752f26fc83 100644 --- a/src/shogun/preprocessor/PCA.cpp +++ b/src/shogun/preprocessor/PCA.cpp @@ -20,8 +20,10 @@ #include #include #include +#include using namespace shogun; +using namespace Eigen; CPCA::CPCA(bool do_whitening_, EPCAMode mode_, float64_t thresh_) : CDimensionReductionPreprocessor(), num_dim(0), m_initialized(false), @@ -175,6 +177,7 @@ void CPCA::cleanup() m_transformation_matrix=SGMatrix(); } +#ifdef HAVE_EIGEN3 SGMatrix CPCA::apply_to_feature_matrix(CFeatures* features) { ASSERT(m_initialized) @@ -183,40 +186,31 @@ SGMatrix CPCA::apply_to_feature_matrix(CFeatures* features) int32_t num_features = m.num_rows; SG_INFO("get Feature matrix: %ix%i\n", num_vectors, num_features) + MatrixXd final_feature_matrix; + if (m.matrix) { SG_INFO("Preprocessing feature matrix\n") - float64_t* res = SG_MALLOC(float64_t, num_dim); - float64_t* sub_mean = SG_MALLOC(float64_t, num_features); - - for (int32_t vec=0; vec*) features)->set_num_features(num_dim); - ((CDenseFeatures*) features)->get_feature_matrix(num_features, num_vectors); - SG_INFO("new Feature matrix: %ix%i\n", num_vectors, num_features) + Map feature_matrix(m.matrix, num_features, num_vectors); + VectorXd data_mean = feature_matrix.rowwise().sum()/(float64_t) num_vectors; + MatrixXd feature_matrix_centered = feature_matrix.colwise()-data_mean; + + SG_INFO("Transforming feature matrix\n") + Map transform_matrix(m_transformation_matrix.matrix, + m_transformation_matrix.num_rows, m_transformation_matrix.num_cols); + final_feature_matrix = transform_matrix.transpose()*feature_matrix_centered; } + + SGMatrix result_matrix = SGMatrix(num_dim, num_vectors); + for (int32_t c=0; c CPCA::apply_to_feature_vector(SGVector vector) {