假设我们有一个10x20的实矩阵:
Eigen::MatrixXd A(10,20);
A.setRandom();
我们想构建一个形式为
的10x10矩阵 B = [v v ... v v]
其中v
是长度为10
的列向量。对于此向量v
,每个元素是A的每一行的平方范数,即:
v = ( ||x_1||^2, ||x_2||^2, ..., ||x_10||^2,)^T
,
其中x_j
表示A的第j行。
构建矩阵B
的最有效方法是什么?
我可以按如下方式构建v
:
Eigen::VectorXd v(10);
for (int i=1; i<10; i++)
{
v(i) = A.row(i).squaredNorm();
}
我认为如果没有for
循环,这一步就无法解决。我如何复制此列10次,以便如上所述填充B
?
答案 0 :(得分:3)
你的假设是错误的。通过执行rowwise
操作可以避免循环。然后,replication可以按如下方式完成。
#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);
我强烈建议您阅读documentation。写得很好。