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