C ++ Eigen. Нужен совет - PullRequest
       66

C ++ Eigen. Нужен совет

1 голос
/ 06 февраля 2020

Нужен совет по поводу Eigen.

Я хочу создать матрицу из коэффициентов векторов (матрицы из одного столбца) 'a' и 'b' следующим образом:

| a0*b0 | a0*b1 | a0*b2 | ... | a0*bn |
| a1*b0 | a1*b1 | a1*b2 | ... | a1*bn |
| a2*b0 | a2*b1 | a2*b2 | ... | a2*bn |
| ...   | ...   | ...   | ... | ...   |
| am*b0 | am*b1 | am*b2 | ... | am*bn |

Если просто, я бы хотел создать таблицу умножения, составленную из двух векторов, и добавить ее в другую матрицу.

Как я могу сделать это наиболее эффективным и элегантным способом?

Я нашел два пути:

Matrix<float, -1, 1> a = new Matrix<float, -1, 1>(6);
Matrix<float, -1, 1> b = new Matrix<float, -1, 1>(4);
MatrixXf SomeNotEmptyMatrix = new MatrixXf(6, 4);

SomeNotEmptyMatrix += a.asDiagonal()*MatrixXf::Constant(6, 4, 1.0)*b.asDiagonal();

и

Matrix<float, -1, 1> a = new Matrix<float, -1, 1>(6);
Matrix<float, -1, 1> b = new Matrix<float, -1, 1>(4);
MatrixXf SomeNotEmptyMatrix = new MatrixXf(6, 4);

for(int32_t i = 0; i < 4; i++){
  SomeNotEmptyMatrix.colwise() += a*b(i, 0);
}

Но я не думаю, что это лучшие. В первом случае будет размещена временная матрица MatrixXf :: Constant (6, 4, 1.0). Во втором случае я использую внешний l oop.

1 Ответ

3 голосов
/ 06 февраля 2020

Это называется внешний продукт , и это можно сделать из двух векторов в Eigen, просто используя стандартный матричный продукт:

MatrixXf result = a * b.transpose();

Обратите внимание, что это противоположный путь чем a.transpose() * b, который вы, возможно, более знакомы, который является точечным произведением, приводящим к единственному скаляру.

...