Salut, j'essaie de débogger un de mes programmes et je bloque complètement sur une erreur que je rencontre.

J'appelle une fonction qui prend certains de ses arguments par référence dans le but de les modifier.

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
 
static void pcamat( const matrix<double> vectors, const int numOfIC, 
              int firstEig, int lastEig, matrix<double> &Es, vector<double> &Ds ) {
 
	  matrix<double> Et;
	  matrix<double> Dt;
	  double lowerLimitValue = 0.0;
	  double higherLimitValue = 0.0;
 
	  int oldDimension = vectors.size1();
 
	  matrix<double> covarianceMatrix = cov( trans(vectors), 0 );
 
	  performPCA( covarianceMatrix, Dt, Et );
	  std::cout << Dt << Et << std::endl;
	  int maxLastEig = 0;
 
	  // Compute rank
	  for ( unsigned i= 0; i< Dt.size1(); i++ ) if ( Dt(i,i) > FICA_TOL ) 
		  maxLastEig++;
 
	  // Force numOfIC components
	  if ( maxLastEig > numOfIC ) maxLastEig = numOfIC;
 
	  vector<double> eigenvalues = zero_vector<double>( Dt.size1() );
	  vector<double> eigenvalues2 = zero_vector<double>( Dt.size1() );
 
	  eigenvalues2 = diag(Dt);
 
	  std::cout << eigenvalues.size() << " " << Dt.size1() << " " << Dt.size2()<< std::endl;
 
	  sort( eigenvalues2 );
 
	  vector<double> lowerColumns = zero_vector<double>( Dt.size1() );
 
	  for ( unsigned i = 0; i < Dt.size1(); i++ ) 
		  eigenvalues(i)= eigenvalues2(Dt.size1()-i-1);
 
	  if ( lastEig > maxLastEig ) lastEig = maxLastEig;
 
	  if ( lastEig < oldDimension ) 
		  lowerLimitValue = ( eigenvalues(lastEig-1)+eigenvalues(lastEig) )/2;
	  else 
		  lowerLimitValue = eigenvalues( oldDimension-1 ) -1;
 
	  for ( unsigned i = 0; i< Dt.size1(); i++ ) 
		  if ( Dt(i,i) > lowerLimitValue ) 
			  lowerColumns(i)= 1;
 
	  if ( firstEig > 1 ) 
		  higherLimitValue = ( eigenvalues( firstEig-2 ) + eigenvalues( firstEig-1 ) )/2;
	  else 
		  higherLimitValue = eigenvalues(0)+1;
 
	  vector<double> higherColumns = zero_vector<double>( Dt.size1() );
	  for ( unsigned i= 0; i < Dt.size1(); i++ ) 
		  if ( Dt(i,i) < higherLimitValue ) 
			  higherColumns(i)= 1;
 
	  vector<double> selectedColumns = zero_vector<double>( Dt.size1() );
	  for ( unsigned i = 0; i < Dt.size1(); i++ ) 
		  selectedColumns(i) = (lowerColumns(i)==1 && higherColumns(i)==1) ? 1 : 0;
 
	  selcol( Et, selectedColumns, Es );
 
	  int numTaken= 0;
 
	  for ( unsigned i= 0; i< selectedColumns.size(); i++ ) 
		  if ( selectedColumns(i) == 1 ) 
			  numTaken++;
 
	  Ds = scalar_vector<double>( numTaken, 0 );
 
	  numTaken= 0;
 
	  for ( unsigned i = 0; i < Dt.size1(); i++ )
	    if ( selectedColumns(i) == 1) {
	      Ds( numTaken ) = Dt(i,i);
	      numTaken++;
	    }
 
	  std::cout << "pcamat fin" << std::endl;
 
	  return;
}
Quand je déboggue avec gdb, avant la sortie de la fonction les matrice Es et vecteur Ds sont bien de taille non nulle et contiennent des données.
Seulement, qd la fonction rend la main pour retourner dans la fonction appelante, alors je constate que les arguments n'ont en fait pas été modifiés.

Que fais-je mal ?

Merci d'avance pour vos réponses et votre aide !