Я пытаюсь решить линейную систему, используя следующий код:
#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 для краткости, но все возвращаемые подпрограммы LAPACKE
возвращают 0.
Тот же код с LAPACK_COL_MAJOR
работает и valgrind работает безупречно.
Мой lapacke, lapack и т. д. собраны самостоятельно для 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
а остальное (оптимизированный blas/lapack и xblas) отключил. При сборке ошибок не было, все тесты прошли успешно.
Где я накосячил?
Редактировать: я только что попробовал это с Fedora21 и упакованным lapacke. Он не воспроизвел ошибку.
Редактировать 2: хотя он не воспроизводит сбой памяти, он выдает неправильное решение, а именно (1 + 0I, 1 + 0I)
для приведенного выше ввода (должно быть (1,0)
)
zgetrf
выполняет один, и вызывает ли он аналогичную ошибку, но это кажется возможным, учитывая, что вы хотите иметь декомпозицию LU. - person martin   schedule 13.05.2015LAPACK_COL_MAJOR
и решение'T'
вместо'N'
похоже работает. - person Baum mit Augen   schedule 13.05.2015valgrind
ничего не сообщает. Какую версию LAPACK вы используете? - person ztik   schedule 13.05.2015ROW_MAJOR
сT
, так иCOL_MAJOR
сN
? А другие комбинации не работают? - person martin   schedule 13.05.2015ROW_MAJOR
и притворился, что матрица равнаCOL_MAJOR
, а затем исправил эту ложь, используя вместо нее'T'
. Я считаю, что это математически то же самое, в конце концов. Для моего приложения меня заботило только решение, а не разложение - person Baum mit Augen   schedule 13.05.2015