复制列 VectorXd 以便在 Eigen、C++ 中构造 MatrixXd
Replicate a column VectorXd in order to construct a MatrixXd in Eigen, C++
假设我们有一个 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
?
你的假设是错误的。可以通过执行 rowwise
operation. Then, the 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。写的不错
假设我们有一个 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
?
你的假设是错误的。可以通过执行 rowwise
operation. Then, the 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。写的不错