#arrays #c #lapack #intel-mkl
#массивы #c #lapack #intel-mkl
Вопрос:
Я пытаюсь использовать mkl для вычисления уравнения. Но кажется, что массив a[] постоянно протекает, подобно этому:
44.62 -0.09 -6277438562204192487878988888393020692503707483087375482269988814848.00 -6277438562204192487878988888393020692503707483087375482269988814848.00 -6277438562204192487878988888393020692503707483087375482269988814848.00
-0.09 11.29 -0.09 -6277438562204192487878988888393020692503707483087375482269988814848.00 -6277438562204192487878988888393020692503707483087375482269988814848.00
-6277438562204192487878988888393020692503707483087375482269988814848.00 -0.09 0.18 -0.09 -6277438562204192487878988888393020692503707483087375482269988814848.00
-6277438562204192487878988888393020692503707483087375482269988814848.00 -6277438562204192487878988888393020692503707483087375482269988814848.00 -0.09 11.29 -0.09
-6277438562204192487878988888393020692503707483087375482269988814848.00 -6277438562204192487878988888393020692503707483087375482269988814848.00 -6277438562204192487878988888393020692503707483087375482269988814848.00 -0.09 44.62
И мой код:
#include <stdlib.h>
#include <stdio.h>
#include "mkl_lapacke.h"
/* Auxiliary routines prototypes */
extern void my_print_matrix(char* desc, MKL_INT m, MKL_INT n, double* a, MKL_INT lda, FILE* fpWrite);
extern void print_matrix(char* desc, MKL_INT m, MKL_INT n, double* a, MKL_INT lda);
/* Parameters */
#define N 5//nstep
#define LDA N
#define RMIN -10.0
#define RMAX 10.0
/* Main program */
int main() {
/* Locals */
MKL_INT n = N, lda = LDA, info;
/* Local arrays */
double h = (RMAX - RMIN) / (double(N) 1.0);;
double xi;
double *w;
double *a;
w= (double*)malloc(sizeof(double) * N);
a = (double*)malloc(sizeof(double) * N*LDA);
for (int i = 0; i < N; i ) {
xi = RMIN double(1.0 i) * h;
a[i*(N 1)] = 2.0 / h / h xi * xi;
if (i==0) {
a[1] = -1.0 / h / h;
}
else if (i == N - 1) {
a[LDA * N-2] =- 1.0 / h / h;
}
else {
a[i *(N 1) 1] = -1.0/h/h;
a[i * (N 1) - 1] = -1.0/h/h;
}
}
print_matrix("Matrix", n, n, a, lda);
/* Executable statements */
printf("LAPACKE_dsyev (row-major, high-level) Example Program Resultsn");
/* Solve eigenproblem */
info = LAPACKE_dsyev(LAPACK_ROW_MAJOR, 'V', 'U', n, a, lda, w);
/* Check for convergence */
if (info > 0) {
printf("The algorithm failed to compute eigenvalues.n");
exit(1);
}
exit(0);
} /* End of LAPACKE_dsyev Example */
/* Auxiliary routine: printing a matrix */
void print_matrix(char* desc, MKL_INT m, MKL_INT n, double* a, MKL_INT lda) {
MKL_INT i, j;
printf("n %sn", desc);
for (i = 0; i < m; i ) {
for (j = 0; j < n; j ) printf(" %6.2f", a[i * lda j]);
printf("n");
}
}
Первые два элемента кажутся правильными, но неправильными числами… И последние числа — это то же самое, но очень большое число. Я думаю, что это утечка массива, но я не знаю, как с этим бороться. Поэтому я прошу о помощи.
И a[] show просто инициализируется, а не результат. Моя проблема в неправильной инициализации?
Комментарии:
1. На несвязанной ноте результат
1.0 i
уже равен adouble
, вам не нужно приведение.2. Пожалуйста, предположите, что я слеп и что мой программа чтения с экрана не может интерпретировать ваше изображение. Показывает ли он изображение текста?
3.
w= malloc(sizeof(*w) * N);
<- Намного лучше4. Что касается вашей проблемы, начните с меньшего набора входных данных и используйте отладчик для пошагового выполнения вашего кода оператор за оператором при мониторинге переменных и их значений. И я также предлагаю вам сохранить результат всех выражений во временных переменных, чтобы было легче видеть их значения. Затем, пока вы выполняете шаг, обратите внимание, какие элементы
a
вы на самом деле инициализируете. Держу пари, вы неправильно инициализируете все элементы.5. Мне не нравится
a[i*(N 1)] = 2.0 / h / h xi * xi;
Ответ №1:
Давайте подробнее рассмотрим, как вы инициализируете a
:
a[i*(N 1)] = 2.0 / h / h xi * xi;
if (i==0) {
a[1] = -1.0 / h / h;
}
else if (i == N - 1) {
a[LDA * N-2] =- 1.0 / h / h;
}
else {
a[i *(N 1) 1] = -1.0/h/h;
a[i * (N 1) - 1] = -1.0/h/h;
}
Давайте рассмотрим два случая, когда i == 0
и i == 1
:
-
i == 0
Здесь вы сначала выполняете безусловную инициализацию
a[i*(N 1)] = 2.0 / h / h xi * xi;
Если мы вычисляем индекс
i*(N 1)
, это0*(N 1)
то, что есть0
. Поэтому вы будете инициализироватьa[0]
.Тогда у вас есть
if (i==0)
место, где вы инициализируетеa[1]
. -
i == 1
Сначала безусловная инициализация индекса
i*(N 1)
, который затем1*(50 1)
равен51
. Итак, здесь вы инициализируетеa[51]
.Тогда оба условия
i==1
иi == N - 1
являются ложными, поэтому мы заканчиваем в последнемelse
предложении:a[i *(N 1) 1] = -1.0/h/h; a[i * (N 1) - 1] = -1.0/h/h;
Первым индексом
i *(N 1) 1
будет1 *(50 1) 1
то, что есть52
. Итак, вы инициализируетеa[52]
.Следующим индексом
i * (N 1) - 1
будет1 * (50 1) - 1
which is50
. Итак, вы инициализируетеa[50]
.
Этот шаблон повторяется на протяжении всего цикла, со все более высокими индексами, но никогда не ниже.
Это означает, что вы никогда не будете инициализировать index 2
to 49
. Эти элементы будут иметь неопределенные значения, и, если вам не повезло, одно из этих значений может быть значениями-ловушками, что приведет к неопределенному поведению при их использовании.
Вам нужно переработать свой алгоритм для инициализации всех элементов массива a
.
Ответ №2:
что касается утечки памяти — пожалуйста, не забудьте освободить всю уже выделенную память для массивов * w и *, вызвав функции free(a) и free(w) .