2013-03-01 14 views
6

robie to dużo:Jak zrobić operacje colwise w 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); 

Am I nie miało być w stanie zrobić coś takiego

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

zamiast?

+0

Zgaduję, że w twoim pytaniu jest mały błąd i że f to VectorXcf, a nie MatrixXcf? – ggael

+0

To prawda. Dziękuję za odpowiedź. –

Odpowiedz

5

Jakie są naprawdę robi to przekątna produkt, więc polecam Ci następujące wyrażenie:

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

Jeśli chcesz użyć colwise() wyrażenia, to nie umieścić go na lewo strona boczna:

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

Co więcej, pozwól, że ostrzeżę Cię o użyciu słowa kluczowego auto. Tutaj, pozwól mi podkreślić, że f_conj nie jest VectorXcf, ale ekspresją koniugatu VectorXcf. Tak więc używanie f_conj lub jest dokładnie takie samo. Ponieważ pomnożenie dwóch kompleksów lub jednej złożonej i jednej liczby zespolonej wynosi ten sam koszt, w tym konkretnym przypadku można użyć słowa kluczowego auto. Jednakże, jeśli f_conj będzie na przykład: auto f_conj = (f+g).conjugate(), wtedy f+g będzie wielokrotnie przeliczane w pętli for. Jednak wykonanie (f+g).conjugate().asDiagonal() * X jest w porządku, ponieważ Eigen wie, co robić.

+0

To prawda, nie myślałem o tym jako o przekątnej mnożenia macierzy. Zakładam ją ze względu na czytelność, którą sugerujesz jako pierwszą? czy też mógłbym osiągnąć wydajność? –

+2

głównie dla czytelności, bu również dla wydajności, w przypadku gdy X jest matrycą typu wiersz-główny. – ggael

+0

Dobrze wiedzieć. Dzięki. –