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 :

Tentative de traduction MATLAB vers C++


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ing�nierie en automatisation et syst�mes intelligents
    Inscrit en
    Septembre 2008
    Messages
    40
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Ing�nierie en automatisation et syst�mes intelligents
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Par d�faut Tentative de traduction MATLAB vers C++
    Bonsoir,

    Je suis d�butant en C++ et j'essaie de traduire un code de MATLAB (Voir la discussion).

    Pour l'instant, j'essaie petit � petit avec des parties de code pour voir si je peux y arriver. Le probl�me, c'est que je d�couvre tout juste la STL (j'ai regard� les tutoriels sur le site), mais j'ai de la difficult� avec certains concepts et "la bonne fa�on de faire".

    Par exemple, la STL contient une fonction find(), mais je n'y comprenais rien pour mes besoins, alors j'ai cr�� la mienne find_idx(). Mais l�, si les valeurs du vecteur sont des double, alors dois-je cr�er une autre fonction o� je remplace int par double ?

    Je sens que ce sera une lourde t�che, car le code MATLAB entier contient beaucoup de tableaux de deux dimensions qui est en fait une liste de vecteurs. Je ne sais pas comment je vais proc�der en C++ pour ces tableaux... Faire des vector<int> matrix ( lignes, vector<int>( colonnes, valeur_init ) ) ? De plus, dans MATLAB, j'ai un bout de code qui vient concat�ner les colonnes de deux matrices. Je n'ai pas encore envisag� cela en C++. Pire encore, je ne conserve que les lignes uniques de ce tableau � deux dimensions. Bonne chance pour moi en C++ !

    Bref, voici ma premi�re tentative avec un petit bout de code. J'appr�cierais quelques astuces et commentaires. Merci.

    PS : Les codes ne sont pas comment�s, mais le lien vers la discussion sur le forum de MATLAB explique le but.

    Voici le code MATLAB :

    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
    close all;
    clear all;
    clc;
     
    n = 9;
     
    A1 = randperm(n);
    A2 = randperm(n);
    idxA1 = randi([1,n]);
    idxA2 = find(A2==A1(idxA1));
     
    disp(['A1 : ',num2str(A1)]);
    disp(['A2 : ',num2str(A2)]);
    disp(['idxA1 : ',num2str(idxA1),' ',num2str(A1(idxA1))]);
    disp(['idxA2 : ',num2str(idxA2),' ',num2str(A2(idxA2))]);
     
    A1 = A1([idxA1:end 1:idxA1-1]);
    A2 = A2([idxA2:-1:1 end:-1:idxA2+1]);
     
    for i = 1:n/2-1
        tmpA1 = (A1==A2(i+1));
        A1(tmpA1) = [];
        tmpA2 = (A2==A1(i+1));
        A2(tmpA2) = [];
    end
     
    C = [A2(end-1:-1:2) A1];
     
    if mod(n,2) == 1
        C(1) = C(end);
        C(end) = [];
    end
     
    disp(['C : ',num2str(C)]);
    Voici le code C++ :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    #include <windows.h>
    #include <conio.h>
    #include <iostream>
    #include <limits>
    #include <vector>
    #include <algorithm>
    #include <numeric>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    using namespace std;
     
    vector<int> find_idx(vector<int> vecteur, int valeur)
    {
    	vector<int> idx;
    	int i = 0;
    	for (vector<int>::iterator it = vecteur.begin(); it != vecteur.end(); it++)
    	{
    		if ( *it == valeur ) idx.push_back(i);
    		i++;
    	}
        return idx;
    }
     
    int main()
    {
    	srand( time(NULL) );
     
    	SetConsoleOutputCP(1252);
     
    	int n;
    	do
    	{
    		cout << "\nEntrez n dans l'intervale [3,15]" << endl;
    		cin >> n;
    		cin.clear(); 
    		cin.ignore((numeric_limits<streamsize>::max)(), '\n' );
    	}
    	while ( n < 3 || n > 15); 
     
    	vector<int> A1( n , 0 );
    	vector<int>::iterator itA1;
    	vector<int> A2( n , 0 );
    	vector<int>::iterator itA2;
    	vector<int> C;
    	vector<int>::iterator itC;
     
    	int idxA1;
    	int idxA2;
     
    	int i = 0;
    	itA2 = A2.begin();
    	for (itA1 = A1.begin(); itA1 != A1.end(); itA1++)
    	{
    			*itA1 = i;
    			*itA2 = i++;
    			itA2++;
    	}
     
    	random_shuffle( A1.begin(), A1.end() );
    	random_shuffle( A2.begin(), A2.end() );
     
    	cout << "A1 :\t";
    	for (itA1 = A1.begin(); itA1 != A1.end(); itA1++)
    	{
    			cout << *itA1 << "\t";
    	}
    	cout << "\nA2 :\t";
    	for (itA2 = A2.begin(); itA2 != A2.end(); itA2++)
    	{
    			cout << *itA2 << "\t";
    	}
     
    	idxA1 = int( floor(rand() % n) );
    	cout << "\nidxA1 :\t" << idxA1 << "\t" << A1[idxA1];
    	vector<int> idxs = find_idx(A2, A1[idxA1]);
    	idxA2 = idxs[0];
    	cout << "\nidxA2 :\t" << idxA2 << "\t" << A2[idxA2];
     
    	rotate(A1.begin(),A1.begin()+idxA1,A1.end());
    	rotate(A2.begin(),A2.begin()+idxA2+1,A2.end());
    	reverse(A2.begin(),A2.end());
     
    	for (i = 0; i < floor(n/2)-1; i++)
    	{
    		vector<int> tmpA1 = find_idx(A1, A2[i+1]);
    		A1.erase(A1.begin()+tmpA1[0]);
    		vector<int> tmpA2 = find_idx(A2, A1[i+1]);
    		A2.erase(A2.begin()+tmpA2[0]);
    	}
     
    	vector<int> tmpA2 = A2;
    	tmpA2.erase(tmpA2.begin());
    	tmpA2.erase(tmpA2.end()-1);
    	reverse(tmpA2.begin(),tmpA2.end());
    	C = tmpA2;
    	C.insert(C.end(),A1.begin(),A1.end());
     
    	if ( n % 2 == 1 )
    	{
    		C[0] = C[C.size()-1];
    		C.erase(C.end()-1);
    	}
     
    	cout << "\nC  :\t";
    	for (itC = C.begin(); itC != C.end(); itC++)
    	{
    			cout << *itC << "\t";
    	}
     
    	cout << "\n";
     
    	getch();
    }

  2. #2
    Membre �m�rite

    Profil pro
    Inscrit en
    D�cembre 2008
    Messages
    533
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 533
    Par d�faut
    Pour les conversions MATLAB -> C++ il est plus que conseill� d'utiliser une librairie de calcul matriciel du genre d'OpenCV :

    http://opencv.org/

    �a devrait t'�pargner des semaines/mois de travail, pour un meilleur r�sultat.

  3. #3
    Membre Expert
    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 : 45
    Localisation : France, Essonne (�le de France)

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par d�faut
    openCV c'est surtout de l'image.

    si tu aimes le cambouis : https://github.com/MetaScale/nt2

Discussions similaires

  1. Traduction C vers MATLAB - d�calage
    Par etudiante-m dans le forum MATLAB
    R�ponses: 8
    Dernier message: 07/03/2012, 12h45
  2. Convertir un fichier MATLAB vers le C++
    Par harris_macken dans le forum MATLAB
    R�ponses: 1
    Dernier message: 30/11/2006, 09h33
  3. Migration de MATLAB vers C++
    Par stiko dans le forum MATLAB
    R�ponses: 16
    Dernier message: 16/06/2006, 11h03
  4. Traduction C++ vers Delphi
    Par lil_jam63 dans le forum Langage
    R�ponses: 6
    Dernier message: 05/07/2004, 13h10
  5. probleme traduction C vers Delphi
    Par zinaif dans le forum Langage
    R�ponses: 3
    Dernier message: 27/06/2003, 08h51

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