2016-02-28 5 views
2

У меня есть сложная матрица A и комплексный вектор b. Я хотел бы решить линейную систему Ax = b. Я попытался использовать пример на этой странице и адаптировать его к моей сложной проблеме. http://eigen.tuxfamily.org/dox/group__TutorialLinearAlgebra.htmlEigen Library: решение комплексной линейной системы

Вот упрощенный пример того, что я пытаюсь сделать:

Мои объекты определяются следующим образом:

typedef Eigen::Matrix<complexd, Eigen::Dynamic, Eigen::Dynamic> DoubleComplexMatrix; 
typedef Eigen::Array<complexd, Eigen::Dynamic, 1> DoubleComplexArray; 

И в моем коде я хочу, чтобы решить эту

DoubleComplexMatrix A(3,3); 
    DoubleComplexArray b(3); 
    DoubleComplexArray x(3); 

    A << 1,2,3, 4,5,6, 7,8,10; 
    b << 3, 3, 4; 
    cout << "Here is the matrix A:\n" << A << endl; 
    cout << "Here is the vector b:\n" << b << endl; 

    ColPivHouseholderQR<DoubleComplexMatrix> dec(A); 
    x = dec.solve(b); 
    cout << "The solution is:\n" << x << endl; 

Ошибка появляется на строке: DoubleComplexArray x = dec.solve(b);, потому что, когда я прокомментирую это, ошибок больше нет.

Я получаю эту ошибку:

TideSolve.cpp:98:38: error: no matching function for call to ‘Eigen::ColPivHouseholderQR<Eigen::Matrix<std::complex<double>, -1, -1> >::solve(DoubleComplexArray&)’ 
DoubleComplexArray x = dec.solve(b); 

Означает ли это, что собственные решатели не работает с комплексом? (Я уверен, что они делают, и я просто плох!) Нужен ли мне еще один решатель, чем ColPivHouseholderQR, который работает с комплексом? Если да, то какой?

Я нашел старую тему, где кто-то используется другой решатель: Solving system Ax=b in linear least squares fashion with complex elements and lower-triangular square A matrix

+1

Я удалил «Пожалуйста, помогите» и «Извинения за мой английский». а) они не актуальны; б) Ваш английский в порядке; лучше я подозреваю, чем значительное число носителей английского языка, которые публикуют здесь. –

+0

Ваш пример показывает: 'DoubleComplexArray x (3);' + 'x = dec.solve (b);'. Ваше сообщение об ошибке и текст показывают «DoubleComplexArray x = dec.solve (b);». Что он? –

ответ

1

Вы должны использовать Eigen::Matrix вместо Eigen::Array. Более поздний - для сырого 2D-массива значений. Первый - для матриц линейных алгебр и векторов. См. Соответствующий manual page.

+0

Большое спасибо за ваш ответ. Это устранило мою проблему. Но я должен признать, что это довольно медленно. Для решения матрицы 1800 * 1800 потребовалось 2 часа. Считаете ли вы, что это нормальное время? Я компилирую с помощью: g ++ -o main * .cpp – Shikashy

+1

Не забудьте включить оптимизацию компилятора с флагом '-O3'. Это должно быть на несколько порядков быстрее. Поскольку ваша проблема квадратная, если вы знаете, что она обратима, то использование 'PartialPivLU' также обеспечит большую скорость. Тогда он должен быть порядка 1 с. – ggael

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