2013-03-01 10 views
6

sto facendo questo molto:Come fare operazioni colwise in Eigen

auto f_conj = f.conjugate(); //f is a MatrixXcf, so is C; 
for(n=0;n<X.cols();++n) 
    C.col(n) = X.col(n).cwiseProduct(f_conj); 

non mi è supposto per essere in grado di fare qualcosa di simile

C.colwise() = X.colwise().cwiseProduct(f_conj) 

invece?

+0

Immagino ci sia un piccolo errore nella tua domanda e che f sia un VectorXcf e non un MatrixXcf? – ggael

+0

Questo è corretto. Grazie per la risposta. –

risposta

5

Quello che state realmente facendo è un prodotto in diagonale, quindi vi consiglio della seguente espressione:

C = f.conjugate().asDiagonal() * X; 

Se si desidera utilizzare un'espressione colwise(), quindi non metterlo a sinistra lato a mano:

C = X.colwise().cwiseProduct(f.conjugate()); 

Inoltre, lascia che ti avvisi circa l'uso della parola chiave auto. Qui, vorrei sottolineare che f_conj non è un VectorXcf, ma un'espressione del coniugato di un VectorXcf. Quindi usare f_conj o è esattamente lo stesso. Dal momento che moltiplica due complessi o un complesso e un complesso coniugato allo stesso costo, in questo caso preciso è ok usare la parola chiave auto. Tuttavia, se f_conj fosse ad esempio: auto f_conj = (f+g).conjugate(), quindi f+g verrà ricalcolato più volte nel ciclo for. Fare lo (f+g).conjugate().asDiagonal() * X è comunque perfetto, perché Eigen sa cosa fare.

+0

Vero, non ci pensava come la diagonale di una moltiplicazione di matrice. Presumo che a causa della leggibilità suggerisci il primo? o vorrei anche ottenere prestazioni? –

+2

principalmente per la leggibilità, bu anche per le prestazioni nel caso X è una matrice principale. – ggael

+0

Buono a sapersi. Grazie. –