Я работаю над проектом (написанным на C), включающим матричную факторизацию, и мне нужна помощь. Моя цель - выделить память для верхней треугольной матрицы, и я хочу получить к ней доступ с помощью алгебраической записи строк и столбцов (т.е. i, j в {1,2,...,n}
вместо i, j в {0,1,...,n-1}
). Например, в матрице 5x5 я должен иметь доступ к элементу [3][4], если введу matrix[3][4]
.
Мой код для верхней треугольной матрицы с неалгебраическим индексом выглядит следующим образом:
double** malloc_sup_matrix (int n)
{
double** L;
int i;
L = (double**)malloc((n)*sizeof(double*));
if(L == NULL)
printerror("allocating space for the matrix (rows).");
for(i = 0; i < n; i++)
{
L[i] = (double*)malloc((n-i)*sizeof(double));
if(L[i] == NULL)
printerror("allocating space for the matrix (cols).");
L[i]-=i;
}
return L;
}
Мой код для алгебраического индекса один (я еще не проверяю, является ли выделенное пространство нулевым, я сделаю это, когда перестану возиться с этим):
int** m;
int i, n;
n = 10;
m = (int**)malloc((n+1)*sizeof(int*));
for(i = 0; i < n; i++)
{
m[i] = (int*)calloc((n+1)-(i),sizeof(int));
m[i] -= i;
}
m--;
for(i = 0; i < n; i++)
{
m[i]--;
}
Он работает именно так, как я хочу, но у меня возникают проблемы с освобождением используемого пространства. Вот как я это делаю:
for(i = 1; i <= n; i++)
{
m[i]++;
}
for(i = 0; i < n; i++)
{
m[i] += (i);
free(m[i]);
}
m++;
free(m);
У вас есть предложения? Заранее большое спасибо ^^.
n
векторов разного размера (которые могут лежать где угодно в памяти), вы также можете использовать один вектор размерностиn(n+1)/2
. Это имеет несколько преимуществ, среди которых совместимость с Blas и Lapack. - person davidhigh   schedule 25.04.2015