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