Реплицируйте столбец VectorXd, чтобы построить MatrixXd в Eigen, Stack Overflow

Давайте предположим, что у нас есть реальная матрица 10×20:

Eigen::MatrixXd A(10,20);
A.setRandom();

Мы хотели бы построить матрицу 10×10 вида

B = [v v ... v v]

где v вектор столбца длины 10, Для этого вектора v, каждый элемент является квадратом нормы каждой строки A, то есть:

v = ( ||x_1||^2, ||x_2||^2, ..., ||x_10||^2,)^T,

где x_j обозначает j-й ряд А.

Каков наиболее эффективный способ построения матрицы B?

Я мог бы построить v следующее:

Eigen::VectorXd v(10);
for (int i=1; i<10; i++)
{
v(i) = A.row(i).squaredNorm();
}

Я думаю, что этот шаг не может быть решен без for петля. Как я мог повторить этот столбец 10 раз, чтобы B заполнен как обсуждено выше?

1

Решение

Ваше предположение неверно. Цикл можно избежать, сделав rowwise операция. Затем копирование можно сделать следующим образом.

#include <iostream>
#include <Eigen/Core>

int main ()
{
Eigen::MatrixXd A(10,20), B, C;
A.setRandom();

Eigen::VectorXd v(10);
v = A.rowwise().squaredNorm();

B = v.replicate(1,10);

std::cout << B << "\n\n";

return 0;
}

Он также может быть записан в одну строку как

    B =  A.rowwise().squaredNorm().replicate(1,10);

Я настоятельно рекомендую прочитать документация. Это довольно хорошо написано.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]