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