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:
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:
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();
} |