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++
6
A
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;
}
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();
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. –
nett ein! Das sollte funktionieren. Vielen Dank! – Zedd
Kann eine "Eigen :: Map" verwenden, um die Matrizen in Vektoren umzuformen, und dann ihr inneres Produkt nehmen. – vsoftco