2014-11-20 9 views
6

Gibt es eine einfache Möglichkeit, die Säule weise Punktprodukt von 2 Matrizen zu bewerten (nennen wir sie A und B vom Typ Eigen::MatrixXd), die Abmessungen mxn, ohne A*B Auswertung oder ohne zu haben, auf for loops? Der resultierende Vektor hätte die Dimensionen 1xn oder nx1. Auch ich versuche, dies mit Eigen in C++ zu tunColumn-weise Skalarprodukt in Eigen C++

+0

Elementweise multiplizieren, dann summieren? In MATLAB wäre es "sum (A. * B)". Eigen stellt diese Operationen zur Verfügung, aber ich kenne die genauen Namen der Aufrufe nicht. –

+0

nett ein! Das sollte funktionieren. Vielen Dank! – Zedd

+0

Kann eine "Eigen :: Map" verwenden, um die Matrizen in Vektoren umzuformen, und dann ihr inneres Produkt nehmen. – vsoftco

Antwort

0

Hier ist, wie ich es mit einer Eigen::Map tun würde (vorausgesetzt, reellen Matrizen, kann über die Einnahme adjoint zu komplex verlängern), wo rows und cols die Zahl bezeichnen Zeilen/Spalten:

#include <Eigen/Dense> 
#include <iostream> 

int main() 
{ 
    Eigen::MatrixXd A(2, 2); 
    Eigen::MatrixXd B(2, 2); 
    A << 1, 2, 3, 4; 
    B << 5, 6, 7, 8; 

    int rows = 2, cols = 2; 

    Eigen::VectorXd vA = Eigen::Map<Eigen::VectorXd>(
          const_cast<double *>(A.data()), rows * cols, 1); 
    Eigen::VectorXd vB = Eigen::Map<Eigen::VectorXd>(
          const_cast<double *>(B.data()), rows * cols, 1); 

    double inner_prod = (vA.transpose() * vB).sum(); 

    std::cout << inner_prod << std::endl; 
} 
+0

Jetzt sehe ich, dass Sie einen Vektor als Ergebnis wollen? Das heißt, sind Sie nach einem \ vect {Ergebnis}, wo jede Komponente A (i,) * B (:, i) 'ist? – vsoftco

+0

Ja, das stimmt. Ich bin mir nicht sicher, wie sich das in den obigen Code übersetzen lässt. – Zedd

5

Es gibt viele Möglichkeiten, dies, alle Durchführung lazy evaluation zu erreichen:

res = (A.array() * B.array()).colwise().sum(); 
res = (A.cwiseProduct(B)).colwise().sum(); 

Und mein Favorit:

res = (A.transpose() * B).diagonal();