2015-05-13 3 views
0

Я хочу переписать C++ EiG функции от Matlab:Эйген библиотеки - комплексные значения в EigenSolver

[V,D] = eig(A,B) produces a diagonal matrix D of generalized 
eigenvalues and a full matrix V whose columns are the corresponding 
eigenvectors so that A*V = B*V*D. 

Я получаю положительные результаты для класса Matrix4d:

pair<Matrix4d, Vector4d> eig(const Matrix4d& A, const Matrix4d& B) 
{ 
const Eigen::GeneralizedSelfAdjointEigenSolver<Matrix4d> solver(A, B); 

const Matrix4d V = solver.eigenvectors(); 
const Vector4d D = solver.eigenvalues(); 

return pair<Matrix4d, Vector4d>(V, D); 
} 

Проблемой я сталкиваюсь в настоящее время является то, что eig в Matlab способен использовать сложные числа - что мне нужно в моем алгоритме.

Как я могу изменить его для получения того же/очень похожего эффекта с использованием класса Matrix4cd вместо Matrix4d?

ответ

1

Если вы не/не может использовать auto в davidhigh это solution попробовать этот

std::pair<Matrix4cd, Vector4d> eig(const Matrix4cd& A, const Matrix4cd& B) 
{ 
    Eigen::GeneralizedSelfAdjointEigenSolver<Matrix4cd> solver(A, B); 

    Matrix4cd V = solver.eigenvectors(); 
    Vector4d D = solver.eigenvalues(); 

    return std::make_pair(V, D); 
} 
+0

Ehh, половина дня потеряна, и я не ожидал, что мне нужно будет изменить cd do c на Vector4d. Это скомпилировано, я должен проверить, как это работает завтра, но теперь вы помогли мне его преобразовать. Оба ответа правильны выше и ниже. Но когда я работаю с vs2005, я буду отмечать это как право (хотел бы отметить оба ...) – F1sher

2

Заменить MatrixXd комплексной версии этого, Matrix4cd (который на самом деле является аббревиатурой для Matrix< std::complex <double>, Dynamic, 4 > см here):

std::pair<Matrix4cd, Vector4d> eig(const Matrix4cd& A, const Matrix4cd& B) 
{ 
    Eigen::GeneralizedSelfAdjointEigenSolver<Matrix4cd> solver(A, B); 

    Matrix4cd V = solver.eigenvectors(); 
    Vector4d D = solver.eigenvalues(); 

    return std::make_pair(V, D); 
} 

Это он уже. Обратите внимание, однако, что вы не можете передавать произвольные матрицы, но матрица A должна быть самосопряженной (также называемой эрмитовой), а B должна быть положительно определена.


EDIT: благодаря замечанию @AviGinsburg, я исправил ошибку, что собственные значения реального (и, таким образом, должны быть сопоставлено с реальным вектором Эйгена). Вот реализация С ++ 14, который решает эту проблему (и поэтому поддерживает мою глупость ;-)):

auto eig(const Matrix4cd& A, const Matrix4cd& B) 
{ 
    Eigen::GeneralizedSelfAdjointEigenSolver<Matrix4cd> solver(A, B); 

    auto V = solver.eigenvectors(); 
    auto D = solver.eigenvalues(); 

    return std::make_pair(V, D); 
} 
+0

Это не компилируется для меня ... –

+0

Я попытался сделать это при запуске. Он возвращает ошибку: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY – F1sher

+0

@Avi Ginsburg: для меня нет, потому что я не проверял ... Я принимал код в компиляторах OP. – davidhigh

Смежные вопросы