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