Я новичок в вычислительной науке, и я уже изучил основные методы для интеграции, интерполяции, методы, такие как RK4, Numerov и т. Д. На C ++, но недавно мой профессор попросил меня научиться использовать LAPACK для решения проблем, связанных с матрицами. Как, например, поиск собственных значений комплексной матрицы. Я никогда не пользовался сторонними библиотеками и почти всегда пишу свои собственные функции. Я искал вокруг в течение нескольких дней, но не могу найти никакого любительского гида по lapack. Все они написаны словами, которые я не понимаю, и я не знаю, почему использование уже написанных функций должно быть таким сложным. Они полны таких слов, как zgeev, dtrsv и т. Д., И я разочарован. Я просто хочу закодировать что-то вроде этого псевдокода:
#include <lapack:matrix>
int main(){
LapackComplexMatrix A(n,n);
for...
for...
cin>>A(i,j);
cout<<LapackEigenValues(A);
return 0;
}
Я не знаю, глупый ли я или любитель. Но опять же, это не должно быть так сложно, не так ли? Я даже не знаю, должен ли я использовать LAPACK или LAPACK ++. (Я пишу коды на C ++ и не знаю Python или FORTRAN) и как их устанавливать.
Ответы:
Я собираюсь не согласиться с некоторыми другими ответами и сказать, что я считаю, что понимание того, как использовать LAPACK , важно в области научных вычислений.
Тем не менее, есть большая кривая обучения для использования LAPACK. Это потому, что написано на очень низком уровне. Недостатком этого является то, что это кажется очень загадочным и не приятным для чувств. Преимущество этого в том, что интерфейс однозначен и практически никогда не меняется. Кроме того, реализации LAPACK, такие как Intel Math Kernel Library , очень быстрые.
Для моих собственных целей у меня есть собственные классы C ++ более высокого уровня, которые охватывают подпрограммы LAPACK. Многие научные библиотеки также используют LAPACK внизу. Иногда их проще использовать, но, на мой взгляд, очень важно понять инструмент под ним. Для этого я привел небольшой рабочий пример, написанный на C ++ и использующий LAPACK, для начала. Это работает в Ubuntu, с
liblapack3
установленным пакетом и другими необходимыми пакетами для сборки. Вероятно, его можно использовать в большинстве дистрибутивов Linux, но установка LAPACK и ссылки на него могут отличаться.Вот файл
test_lapack.cpp
Это может быть построено с помощью командной строки
Это создаст исполняемый файл с именем
test_lapack
. Я настроил это для чтения в текстовом файле ввода. Вот файл с именем,matrix.txt
содержащий матрицу 3х3.Для запуска программы просто наберите
в командной строке, и вывод должен быть
Комментарии:
extern "C"
раздел в верхней части, и я добавил к нему подчеркиваниеdgeev_
. Это потому, что библиотека была написана и построена на Фортране, поэтому это необходимо, чтобы символы соответствовали при соединении. Это зависит от компилятора и системы, поэтому, если вы используете это в Windows, все это должно измениться.источник
Я обычно сопротивляюсь рассказывать людям, что я думаю, что они должны делать, а не отвечать на их вопрос, но в этом случае я собираюсь сделать исключение.
Lapack написан на фортране, а API очень похож на фортран. Существует интерфейс C API для Lapack, который делает интерфейс немного менее болезненным, но использование Lapack из C ++ никогда не будет приятным.
В качестве альтернативы существует библиотека классов матрицы C ++ под названием Eigen, которая обладает многими возможностями Lapack, обеспечивает вычислительную производительность, сравнимую с лучшими реализациями Lapack, и очень удобна для использования из C ++. В частности, вот как ваш пример кода может быть написан с использованием Eigen
В этом примере проблема собственных значений является тестом для функции Лапака
dgeev
. Вы можете просмотреть код FORTRAN и результаты для этого примера задачи dgeev и сделать свои собственные сравнения.источник
operator,
! Никогда не видел, чтобы это было сделано на практике :-)operator,
перегрузка интереснее / лучше, чем может показаться на первый взгляд. Он используется для инициализации матриц. Элементы, которые инициализируют матрицу, могут быть скалярными константами, но также могут быть предварительно определенными матрицами или субматрицами. Очень похоже на MATLAB. Хотелось бы, чтобы мои навыки программирования на C ++ были достаточно хороши, чтобы реализовать что-то более сложное ;-)Вот еще один ответ в том же духе, что и выше.
Вы должны заглянуть в библиотеку линейной алгебры Armadillo C ++ .
Плюсы:
DGESV
мумбо-юмбо, простоX = solve( A, B )
(хотя за этими странно выглядящими именами функций LAPACK есть причина ...).Вот как будет выглядеть код @ BillGreene с Armadillo:
источник