Я пытаюсь решить линейную систему, используя следующий код:Использования LAPACKE_zgetrs с LAPACK_ROW_MAJOR вызывает незаконный доступ к памяти
#include <stdio.h>
#include <lapacke.h>
int main() {
lapack_complex_double mat[4];
lapack_complex_double vec[2];
lapack_int p[2];
mat[0] = lapack_make_complex_double(1,0);
mat[1] = lapack_make_complex_double(1,0);
mat[2] = lapack_make_complex_double(1,0);
mat[3] = lapack_make_complex_double(-1,0);
vec[0] = lapack_make_complex_double(1,0);
vec[1] = lapack_make_complex_double(1,0);
LAPACKE_zgetrf(LAPACK_ROW_MAJOR, 2, 2, mat, 2, p);
LAPACKE_zgetrs(LAPACK_ROW_MAJOR, 'N', 2, 1, mat, 2, p, vec, 2);
printf("%g %g\n", lapack_complex_double_real(vec[0]),
lapack_complex_double_imag(vec[0]));
return 0;
}
По некоторым причинам, это вызывает незаконный доступ к памяти в LAPACKE_zgetrs
(в обнаруженной valgrind
и мой большая ошибка программы в zgetrs
из-за «glibc обнаружил коррупцию или двойной свободный»). Я не включал это в свой SSCCE для краткости, но все процедуры, которые возвращают, возвращают 0.
Тот же код с работает безотказно.
Мой лапак, лапак и т. Д. Является самомонтирующимся для Ubuntu 12.04. Я использовал следующие настройки в файле LaPack CMake:
BUILD_COMPLEX ON
BUILD_COMPLEX16 ON
BUILD_DOUBLE ON
BUILD_SHARED_LIBS ON
BUILD_SINGLE ON
BUILD_STATIC_LIBS ON
BUILD_TESTING ON
CMAKE_BUILD_TYPE Release
LAPACKE ON
LAPACKE_WITH_TMG ON
, а остальные (оптимизированный Блас/LAPACK и xblas) выкл. Во время сборки ошибок не было, и все тесты были успешными.
Где я испортил?
Редактировать: Я просто попробовал это с Fedora21 и упакованным лапакцем. Он сделал не воспроизвести ошибку.
Edit 2: Хотя он не воспроизводит память терпит неудачу, он производит неправильное решение, а именно (1 + 0I, 1 + 0I)
для выше входа (должен быть (1,0)
)
Я нашел [эту тему] (https://software.intel.com/en-us/forums/topic/499788), которая указывает на ошибку в LAPACKE с большой упаковкой строк при вычислении холесной факторизации. Я не уверен, что 'zgetrf'performs один, и если он вызывает аналогичную ошибку, но это кажется возможным, если вы хотите иметь разложение LU. – martin
@martin холесная факторизация - это разложение LL^T. – ztik
@ctheo yes, который в некоторых случаях является особым случаем LU-разложения. Но вы правы, матрица не является положительно определенной. – martin