Eigen3 replicate() для операции cwiseProduct матрицы-вектора

У меня есть следующий код:

Eigen::MatrixXf aMatrix( 3, 5 );
aMatrix <<
1, 0, 1, 0, 1,
0, 1, 0, 1, 0,
1, 1, 1, 1, 1;

Eigen::VectorXf aVector( 5 );
aVector << 3, 4, 5, 6, 7;

cout << aMatrix.cwiseProduct( aVector.replicate( 1, aMatrix.rows() ).transpose() ) << endl;

который выводит:

3 0 5 0 7
0 4 0 6 0
3 4 5 6 7

Есть ли более эффективный способ добиться этого, чем вызов replicate()?


person pt3dNyc    schedule 25.08.2014    source источник


Ответы (2)


Решено (с помощью: Как я могу применить функциональность, подобную bsxfun, в Эйген?)

Они эквивалентны:

aMatrix.cwiseProduct( aVector.replicate( 1, aMatrix.rows() ).transpose() )
aMatrix.array().rowwise() * aVector.array().transpose()
person pt3dNyc    schedule 25.08.2014

Я не уверен, что это более эффективно, но умножение поста на диагональную матрицу - еще один вариант.

aMatrix * aVector.asDiagonal();

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

int main()
{

  Eigen::MatrixXf aMatrix( 3, 5 );
  aMatrix <<
    1, 0, 1, 0, 1,
    0, 1, 0, 1, 0,
    1, 1, 1, 1, 1;

  Eigen::VectorXf aVector( 5 );
  aVector << 3, 4, 5, 6, 7;

  std::cout << aMatrix * aVector.asDiagonal() << std::endl;

  return 0;
}
person Akavall    schedule 07.09.2014