我是Eigen的新手,我想按行对矩阵进行规范化,所以我的代码如下:
int buf[9];
for (int i{0}; i < 9; ++i) {
buf[i] = i;
}
m = Map<MatrixXi>(buf, 3,3);
MatrixXi mean = m.colwise().mean();
VectorXi m2 = Map<VectorXi>(mean.data(), mean.cols());
m.rowwise() -= m2;
这是行不通的,因为m2
被解释为垂直的,这是什么原因造成的?
顺便说一句,我发现我无法避免创建一个mean
矩阵,我认为我可以:
// this works
MatrixXi mean = m.colwise().mean();
VectorXi m2 = Map<VectorXi>(mean.data(), mean.cols());
// this cannot pass the compilation check
VectorXi m2 = Map<VectorXi>(m.colwise().mean().data(), m.cols());
那可能是什么原因造成的?
答案 0 :(得分:3)
您的问题不是很清楚,但我想您正在寻找.transpose()
。同样也无需重新映射.mean()
的结果:
Map<MatrixXi> m(buf, 3,3);
VectorXi mean = m.colwise().mean();
m.rowwise() -= mean.transpose();
或直接使用行向量:
RowVectorXi mean = m.colwise().mean();
m.rowwise() -= mean;
甚至是单线:
m.rowwise() -= m.colwise().mean().eval();