Результат 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