Результат SelfAdjointEigenSolver, сохраненный как член, повторно инициализируется, когда в другой области видимости

Я пытаюсь запустить PCA на блоке собственной матрицы. Наблюдения во входной матрице находятся в столбцах. Я хочу сохранить собственные векторы в виде матрицы для последующего использования. Но матрица (m_pcaCoefs) "переинициализируется", когда я использую ее в другой области видимости внутри класса, конечно.

Я почти уверен, что что-то упустил из-за того, как работает eigen!

class foo {
    public:
    using InputMatrixType = Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>;

        void computePca(InputMatrixType & inputMatrix)
        {
            // m_pcaCoefs is a private member of dense matrix type
            size_t start = 1;
            auto r = inputMatrix.rows();
            auto c = inputMatrix.cols(); 
            Eigen::Block<InputMatrixType>  inputBlock 
                  = inputMatrix.block( start, 0 ,r-start , c   );

            // center the data
            m_pixelValueMeans = inputBlock.rowwise().mean();
            inputBlock.colwise() -= m_pixelValueMeans;

            // inputBlock is a d by n, where d is the number of observation
            InputMatrixType cov = inputBlock * inputBlock.adjoint();
            cov = cov / (c - 1);
            Eigen::SelfAdjointEigenSolver<InputMatrixType> eig(cov);
            InputMatrixType m_pcaCoefs = eig.eigenvectors();
            // here m_pcaCoefs looks fine
            std::cout << m_pcaCoefs.size() << std::endl; // output: 9  
        }

        void print()
        {
            std::cout << m_pcaCoefs.size() << std::endl; // output: 0
        }
    protected:
       InputMatrixType m_pcaCoefs;
}


int main()
{
    foo test;
    test.computePca(someMatrix); // outputs 9
    test.print() // output 0
}

Любая подсказка, как получить собственные векторы, которые будут скопированы в m_pcaCoefs?

1 ответ

Решение
InputMatrixType m_pcaCoefs = eig.eigenvectors();

это не то, что вы думаете, кто является членом вашего класса.

Вы должны просто использовать:

m_pcaCoefs = eig.eigenvectors(); // use member m_pcaCoefs
Другие вопросы по тегам