Как можно вычесть собственную матрицу 1xN из матрицы MxN, как это делает numpy? - PullRequest
0 голосов
/ 03 января 2019

Я не могу суммировать матрицу 1xN из матрицы MxN, как я это делаю в numpy.

Я создаю матрицу из np.arange(9).reshape(3,3) с собственным значением:

int buf[9];
for (int i{0}; i < 9; ++i) {
    buf[i] = i;
}
m = Map<MatrixXi>(buf, 3,3);

Затем я вычисляю среднее значение по направлению строки:

    m2 = m.rowwise().mean();

Я хотел бы передать m2 в матрицу 3x3 и вычесть ее из m, как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Вам необходимо использовать соответствующие типы для ваших значений, MatrixXi не хватает векторных операций (таких как широковещательная передача).У вас также, кажется, есть плохая привычка объявлять переменные задолго до того, как вы их инициализируете.Не.

Это должно работать

std::array<int, 9> buf;
std::iota(buf.begin(), buf.end(), 0);

auto m = Map<Matrix3i>(buf.data());
auto v = m.rowwise().mean();
auto result = m.colwise() - v;
0 голосов
/ 09 января 2019

Хотя уже предложенный метод .colwise() предпочтительнее в этом случае, на самом деле также возможно транслировать вектор на несколько столбцов, используя метод replicate.

m -= m2.replicate<1,3>();
// or
m -= m2.rowwise().replicate<3>();

Если 3 неизвестно во время компиляции, вы можете написать

m -= m2.rowwise().replicate(m.cols());
0 голосов
/ 03 января 2019

В Eigen нет ничего похожего на широковещательное вещание, вы можете использовать тот же шаблон, который вы использовали:

m.colwise() -= m2

(см. Учебное пособие Eigen по этому вопросу )

Примечание: m2 должен быть вектором, а не матрицей.Кроме того, чем больше фиксированных размеров, тем лучше компилятор может генерировать эффективный код.

...