2015-04-25 2 views
1

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 ^^.

+0

« 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

+3

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

Répondre

0

Il y a un problème sur cette ligne:

m--; 
for(i = 0; i < n; i++) 
{ 
    m[i]--; 
} 

Vous êtes décrémentation m, puis aller de l'avant et l'indexer de 0 ... Je suppose que vous pouvez finir par gâcher les structures de tas.

je réussi à avoir votre sans erreur valgrind de code comme ceci:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 


int main(int argc, char *argv[]) 
{ 
    int** m; 
    int  i, j, 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; 
    } 

    for(i = 0; i < n; i++) 
    { 
     m[i]--; 
    } 

    m--; 

    /* Access it like m[1][1] ... m[n][n], m[i][j] (with i <= j) */ 

    /* 
    for (i = 1; i <= n; i++) { 
     for (j = i; j <= n; j++) { 
      m[i][j] = i+j; 
     } 
    } 
    */ 

    m++; 

    for(i = 0; i < n; i++) 
    { 
     m[i]++; 
    } 

    for(i = 0; i < n; i++) 
    { 
     m[i] += (i); 
     free(m[i]); 
    } 

    free(m); 

    return 0; 
} 
+0

Cela a fonctionné comme un charme. Merci beaucoup! –