Je travaille sur un projet (écrit en C) impliquant la factorisation matricielle et j'ai besoin d'aide. Mon objectif est d'allouer de la mémoire pour une matrice triangulaire supérieure et je veux y accéder via une notation de ligne et de colonne algébrique (ie i, j en {1,2,...,n}
au lieu de i, j en {0,1,...,n-1}
). Par exemple, dans une matrice 5x5, je devrais pouvoir accéder à l'élément [3] [4] si je saisis matrix[3][4]
.Allocation d'espace pour les matrices triangulaires supérieures en notation algébrique
Mon code pour une matrice triangulaire supérieure index non-algébrique ressemble à ceci:
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;
}
Mon code pour l'indice algébrique d'un (je ne suis pas vérifier si l'espace alloué est nul encore, je vais le faire quand j'arrête de déconner avec ça):
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]--;
}
il fonctionne exactement comme je le veux, mais j'ai des problèmes lors de la libération de l'espace que je l'ai utilisé. Ceci est la façon dont je le fais:
for(i = 1; i <= n; i++)
{
m[i]++;
}
for(i = 0; i < n; i++)
{
m[i] += (i);
free(m[i]);
}
m++;
free(m);
Avez-vous les gars avez des suggestions? Merci beaucoup d'avance ^^.
« mais j'ai des problèmes lors de la libération de l'espace que je l'ai utilisé. » S'il vous plaît soyez explicite. Quel est le problème que vous rencontrez? – kaylum
Je suggérerais de repenser votre concept de stockage. Plutôt que d'allouer de l'espace pour des vecteurs de tailles différentes (qui peuvent se trouver n'importe où dans la mémoire), vous pouvez également utiliser un vecteur de dimension 'n (n + 1)/2'. Ceci présente plusieurs avantages, parmi lesquels l'interopérabilité avec Blas et Lapack. – davidhigh