IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

comment creer une matrice plus que 2 dimension en c++?


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 98
    Points : 36
    Points
    36
    Par défaut comment creer une matrice plus que 2 dimension en c++?
    bonsoir,

    je veux créer une matrice à n dimension.
    par exemple en matlab lorsque je veux créer(initialiser) plusieurs matrices de nombre inconnu(n) de taille chacun (l,m) donc je fais comme ça
    k = zeros(l,m,n);

    lorsque je veux obtenir la matrice 3 de taille (l,m) juste j'écris k(l,m,3);

    sont les matrices plus que deux dimensions.(comme les feuilles de cahiers l'une sur l'autre juste je connais le numéro de page(n) donc je peux accéder a la page voulu(matrice de taille (l,m))

    je veux faire ça en c++.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 352
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 352
    Points : 20 359
    Points
    20 359
    Par défaut
    Salut,

    Citation Envoyé par AYDIWALID Voir le message
    bonsoir,

    je veux créer une matrice à n dimension.
    par exemple en matlab lorsque je veux créer(initialiser) plusieurs matrices de nombre inconnu(n) de taille chacun (l,m) donc je fais comme ça
    k = zeros(l,m,n);
    en C++ ce n'est pas possible de créer un tableau de taille variable pour la simple raison que les dimensions doivent être connus à la compilation.
    ( en C#/.Net c'est peut-être possible )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int i=2 ;
    int tableau[i,i];
    -------------------Configuration: program - Win32 Debug--------------------
    Compiling...
    main.cpp
    D:\temp\main.cpp(84) : error C2057: expected constant expression
    D:\temp\main.cpp(84) : error C2466: cannot allocate an array of constant size 0
    D:\temp\main.cpp(84) : error C2133: 'tableau' : unknown size
    Error executing cl.exe.
    main.obj - 3 error(s), 0 warning(s)
    Par contre tu as des conteneurs de la STL comme std::vector , tableau de taille dynamique qui fera affaire.
    Regarder aussi dans Boost , il y a probablement un conteneur qui fasse cela..

    http://www.boost.org/doc/libs/1_45_0...doc/index.html

  3. #3
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    boost::multi_array, nt2, eigen ont ce genre de choses

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 98
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Joel F Voir le message
    boost::multi_array, nt2, eigen ont ce genre de choses
    Merci bien

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Tu m'as tout l'air d'avoir un besoin en traitement d'image... OpenCV aussi contient ce qu'il faut pour bosser sur des matrices et des sous matrices en évitant de réallouer quand ce n'est pas nécessaire, ainsi que tout plein d'autres fonctions bien utiles.

    Si c'est pour de la recherche ou un programme simple pour tes études (si tu en fais), CImg peut aussi faire l'affaire.
    Find me on github

  6. #6
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    je conseillerais openCV sur un forum C++ le jour ou leur interface C++ sera correctement faite.

    CImg malgré son coté WTF a de trés bon truc aussi.

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Joel F Voir le message
    je conseillerais openCV sur un forum C++ le jour ou leur interface C++ sera correctement faite.
    Je suis d'accord qu'elle est assez mal branlée mais bon, pour les travaux sur les matrices ça va, et les autres outils d'OpenCV peuvent se révéler précieux, dans le cas du traitement d'image.

    Citation Envoyé par Joel F Voir le message
    CImg malgré son coté WTF a de trés bon truc aussi.
    Normal, ce n'est pas du tout destiné à la production, c'est bien pour développer un algo vite fait.
    Find me on github

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 98
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Je suis d'accord qu'elle est assez mal branlée mais bon, pour les travaux sur les matrices ça va, et les autres outils d'OpenCV peuvent se révéler précieux, dans le cas du traitement d'image.



    Normal, ce n'est pas du tout destiné à la production, c'est bien pour développer un algo vite fait.
    bonsoir a tous,

    j'ai besoin d'une fonction qui peut retourner un tableau (statique) a 3 dimension . ok je les fait sans problem en utilisant les strctures.
    mais lorsque j'augmente la taille du tableau (struct tabdd{
    int tab[112][128][123];}; et même j'ai besoin plus que sa.
    il apparait l'erreur suivante:
    comment je peux résoudre ce problème. stack averflow

    sa marche sans problème avec matlab mais pourquoi non avec visuel.
    comment on peut résoudre se dépassement de pile(stack averflow).

    Merci d'avance.

  9. #9
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    en faisant une allcoation dynamique ...

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 98
    Points : 36
    Points
    36
    Par défaut Unhandled exception at 0x004afb37 in exercice.exe: 0xC00000FD: Stack overflow.
    Citation Envoyé par jblecanard Voir le message
    Je suis d'accord qu'elle est assez mal branlée mais bon, pour les travaux sur les matrices ça va, et les autres outils d'OpenCV peuvent se révéler précieux, dans le cas du traitement d'image.



    Normal, ce n'est pas du tout destiné à la production, c'est bien pour développer un algo vite fait.
    bonsoir a tous,

    j'ai besoin d'une fonction qui peut retourner un tableau (statique) a 3 dimension . ok je les fait sans problem en utilisant les strctures.
    mais lorsque j'augmente la taille du tableau (struct tabdd{
    int tab[112][128][123];}; et même j'ai besoin plus que sa.
    il apparait l'erreur suivante:

    Unhandled exception at 0x004afb37 in exercice.exe: 0xC00000FD: Stack overflow.
    comment je peux résoudre ce problème. stack averflow

    sa marche sans problème avec matlab mais pourquoi non avec visuel.
    comment on peut résoudre se dépassement de pile(stack averflow).

    Merci d'avance.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 98
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par AYDIWALID Voir le message
    bonsoir a tous,

    j'ai besoin d'une fonction qui peut retourner un tableau (statique) a 3 dimension . ok je les fait sans problem en utilisant les strctures.
    mais lorsque j'augmente la taille du tableau (struct tabdd{
    int tab[112][128][123];}; et même j'ai besoin plus que sa.
    il apparait l'erreur suivante:

    Unhandled exception at 0x004afb37 in exercice.exe: 0xC00000FD: Stack overflow.
    comment je peux résoudre ce problème. stack averflow

    sa marche sans problème avec matlab mais pourquoi non avec visuel.
    comment on peut résoudre se dépassement de pile(stack averflow).

    Merci d'avance.
    comment je peut faire pour une strcture de type tableau.
    par exemple:
    j'ai une variable de type strct nommé stab.
    struct tabdd{
    int tab[112][128][123];};

    j'ai fait comme ca:
    stab= malloc(112*128 *123* sizeof(int));
    mais une erreur : binary '=' : no operator found which takes a right-hand operand of type 'void *' (or there is no acceptable conversion)

    tabdd stab;

  12. #12
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    j'ai besoin d'une fonction qui peut retourner un tableau (statique) a 3 dimension . ok je les fait sans problem en utilisant les strctures.
    mais lorsque j'augmente la taille du tableau (struct tabdd{
    int tab[112][128][123];}; et même j'ai besoin plus que sa.
    il apparait l'erreur suivante:

    Unhandled exception at 0x004afb37 in exercice.exe: 0xC00000FD: Stack overflow.
    comment je peux résoudre ce problème. stack averflow

    sa marche sans problème avec matlab mais pourquoi non avec visuel.
    comment on peut résoudre se dépassement de pile(stack averflow).
    C'est plutôt clair comme message non ? Tu éclates la pile car tu demandes trop de mémoire (en moyenne, la pile es limitée à 1/2 Mo). La solution est de faire une allocation dynamique. Pour cela, soit tu le fais à la main (dans ce cas dit bonjour à int*** et à tous les problèmes associés) ou alors tu passes par des outils qui le font pour toi (cf réponse de Joel)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  13. #13
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 98
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    C'est plutôt clair comme message non ? Tu éclates la pile car tu demandes trop de mémoire (en moyenne, la pile es limitée à 1/2 Mo). La solution est de faire une allocation dynamique. Pour cela, soit tu le fais à la main (dans ce cas dit bonjour à int*** et à tous les problèmes associés) ou alors tu passes par des outils qui le font pour toi (cf réponse de Joel)
    voila mon code.

    comment je peux faire ca?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <math.h>
    #include<stdio.h>
    #include<stdlib.h>
     
    struct tabdedans{
     int tab[112][128][123];
     };
     
    //2 eme FONCTION 
    tabdedans fonc2(tabdedans arg,int r,int m,int n)
     
    {
    	int i,j,k;
    	double x=n*m*r;
    	for(int k=0;k<123;k++)
    	 {
    		for(int i=0;i<112;i++)
    			for(int j=0;j<128;j++)
    			{
     
    	arg.tab[i][j][k]=x+arg.tab[i][j][k] ;
    			}
    	}
    	return arg;
    }
    //fin fonc2
    tabdedans fonc(tabdedans arg,int rayonmin,int ny)
     {	
    	 int mx=3;	 
    		for(int j=0;j<123;j++)
    			{
    		 arg=fonc2(arg,rayonmin+j,mx,ny);
    			}
     
     return arg ;
     }
     //findeclaration fonction qui retourne un tableau
    int main()
     
    {
     
    	  tabdedans stab= {0},stab1 ; //remplissage à 0 de la structure, donc du tableau
     
    	  stab= malloc(112*128 *123* sizeof(int));
     
    	  stab=fonc(stab,3,9);
     
    	  for(int k=0;k<123;k++)
    	 {
    		for(int i=0;i<112;i++)
    			for(int j=0;j<128;j++)
    			{
     
    		 printf("satb[%d][%d][%d]=%d\n",i,j,k,stab.tab[i][j][k]) ;//limpide ! 
     
    			}
    	 } 
     
       return 0;
    }

Discussions similaires

  1. comment creer une matrice Walsh-Hadamard avec c++
    Par dev0077 dans le forum Eclipse C & C++
    Réponses: 1
    Dernier message: 03/10/2007, 12h06
  2. Réponses: 3
    Dernier message: 19/07/2006, 15h28
  3. Réponses: 1
    Dernier message: 11/04/2005, 10h59
  4. Comment creer une bande bootable ?
    Par sdeb dans le forum Administration système
    Réponses: 7
    Dernier message: 13/01/2004, 18h26
  5. [TP]comment creer une disquette bootable (les fichiers)
    Par ludovic5532 dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 25/10/2003, 19h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo