代码之家  ›  专栏  ›  技术社区  ›  beesleep

保存为成员的SelfAdjointEigenSolver的结果在另一个作用域中重新初始化

  •  0
  • beesleep  · 技术社区  · 6 年前

    我试图在特征矩阵的一个块上运行pca。 输入矩阵中的观察值以列为单位。 我想将特征向量保存为矩阵,以供以后使用。 但是,当我在另一个范围内使用矩阵(m\u 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\u pcaCoefs?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Joseph D.    6 年前
    InputMatrixType m_pcaCoefs = eig.eigenvectors();
    

    这不是你所想的,这是你班上的一员。

    您只需使用:

    m_pcaCoefs = eig.eigenvectors(); // use member m_pcaCoefs