2014-11-20 22 views
6

Có một cách dễ dàng để đánh giá cột khôn ngoan chấm sản phẩm của 2 ma trận (cho phép gọi cho họ AB, kiểu Eigen::MatrixXd) có kích thước mxn, mà không đánh giá A*B hay mà không cần phải khu nghỉ mát để for vòng? Vector kết quả sẽ cần phải có kích thước của 1xn hoặc nx1. Ngoài ra, tôi đang cố gắng làm điều này với Eigen trong C++Cột-khôn ngoan dot sản phẩm trong Eigen C++

+0

Nhân tố khôn ngoan nhân, sau đó tính tổng? Trong MATLAB nó sẽ là 'tổng (A. * B)'. Eigen cung cấp các hoạt động đó, nhưng tôi không biết chính xác tên của các cuộc gọi. –

+0

đẹp nhất! Cần làm việc. Cảm ơn! – Zedd

+0

Có thể sử dụng "Eigen :: Map" để định hình lại ma trận thành vec-tơ, sau đó lấy sản phẩm bên trong của chúng. – vsoftco

Trả lời

0

Dưới đây là cách tôi làm điều đó với một số Eigen::Map (giả định ma trận thực, có thể mở rộng đến phức tạp thông qua việc bổ sung), trong đó rowscols biểu thị số hàng/cột:

#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

Bây giờ tôi thấy rằng bạn muốn một véc tơ là kết quả? Tức là, bạn có phải là \ vect {result} trong đó mỗi thành phần là A (i,) * B (:, i) 'không? – vsoftco

+0

Vâng, đúng vậy. Tôi không chắc làm thế nào điều này sẽ chuyển thành mã bạn có ở trên. – Zedd

5

có rất nhiều cách để đạt được điều này, tất cả các đánh giá lười biếng thực hiện:

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

Và yêu thích của tôi:

res = (A.transpose() * B).diagonal(); 
Các vấn đề liên quan