2014-11-20 16 views
6

C'è un modo semplice per valutare colonna prodotto scalare saggio di 2 matrici (lascia chiamarli A e B, di tipo Eigen::MatrixXd) che hanno dimensioni mxn, senza valutare A*B o senza dover ricorrere ai cicli for? Il vettore risultante avrebbe bisogno di avere dimensioni di 1xn o nx1. Inoltre, sto cercando di fare questo con Eigen in C++colonna-saggio Eigen C++

+0

Moltiplica l'elemento, quindi somma? In MATLAB sarebbe 'somma (A. * B)'. Eigen fornisce tali operazioni, ma non conosco i nomi esatti delle chiamate. –

+0

bello! Questo dovrebbe funzionare Grazie! – Zedd

+0

È possibile utilizzare un "Eigen :: Map" per rimodellare le matrici in vettori, quindi prendere il loro prodotto interno. – vsoftco

risposta

0

Ecco come lo farei con una Eigen::Map (assumendo matrici reali, può estendersi a complesse tramite prendendo l'aggiunto), dove rows e cols denotano il numero di righe/colonne:

#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

Ora vedo che vuoi un vettore come risultato? Cioè, stai cercando un \ vect {result} dove ogni componente è A (i,) * B (:, i) '? – vsoftco

+0

Sì, questo è giusto. Non sono sicuro di come questo si tradurrebbe nel codice che hai sopra. – Zedd

5

ci sono molti modi per raggiungere questo, tutta l'esecuzione di valutazione pigra:

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

E il mio preferito:

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