2013-02-28 7 views
12

Sto usando la libreria Eigen in C++: Attualmente sto calcolando la matrice di covarianza me stesso come segue:Eigen: C'è un modo integrato per il calcolo del campione covarianza

Eigen::MatrixXd covariance_matrix = Eigen::MatrixXd::Constant(21, 21, 0); 
data mean = calc_mean(all_data) 
for(int j = 0; j < 21; j++){ 
    for(int k = 0; k < 21; k++){ 
     for(std::vector<data>::iterator it = all_data.begin(); it!= all_data.end(); it++){ 
      covariance_matrix(j,k) += ((*it)[j] - mean[j]) * ((*it)[k] - mean[k]); 
     } 
     covariance_matrix(j,k) /= all_data.size() - 1; 
    } 
} 

C'è un/modo integrato più ottimizzato per fai questo con la libreria Eigen? Ad esempio, se memorizzo i miei dati in un MatrixXd in cui ogni riga è un'osservazione e ogni colonna è una caratteristica?

Grazie

risposta

6

Quando ciascuna riga è un'osservazione, è possibile utilizzare la formulazione della matrice per la matrice di covarianza del campione come mostrato wikipedia (http://en.wikipedia.org/wiki/Sample_mean_and_sample_covariance#Sample_covariance)

Sample covariance, source: wikipedia article linked above.

Questo è abbastanza facile da scrivere in termini di moltiplicazioni di matrici Eigen ecc. Se sarà più performante non è ovvio per me, ho il sospetto che l'ottimizzatore dovrebbe fare un ottimo lavoro (assicuratevi di usare almeno -O2). Potrebbe valere la pena provarlo e profilarlo.

43

Utilizzo di espressioni Eigen farà leva SIMD e algoritmi della cache ottimizzata, quindi sì, dovrebbe assolutamente essere più veloce, e in ogni caso, molto più semplice da scrivere:

MatrixXd centered = mat.rowwise() - mat.colwise().mean(); 
MatrixXd cov = (centered.adjoint() * centered)/double(mat.rows() - 1); 

Inoltre, assumendo "dati" è un typedef per una doppia [21], quindi è possibile utilizzare la mappa <> funzione per visualizzare lo std :: vector come oggetto Eigen:

Map<Matrix<double,Dynamic,21,RowMajor> > mat(&(all_data[0][0], all_data.size(), 21); 
+5

Fare attenzione per 'mat.rows() == 1'. –

Problemi correlati