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ć.
Zgaduję, że w twoim pytaniu jest mały błąd i że f to VectorXcf, a nie MatrixXcf? – ggael
To prawda. Dziękuję za odpowiedź. –