我如何像numpy一样从MxN矩阵中减去1xN本征矩阵?

时间:2019-01-03 11:32:21

标签: c++ eigen

我无法像numpy中那样从MxN矩阵中总结出1xN矩阵。

我用这样的本征来创建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 :(得分:3)

Eigen中没有类似numpy的广播,您可以做的是重用您以前使用的相同模式:

m.colwise() -= m2

(请参见Eigen tutorial on this

N.B .: m2必须是向量,而不是矩阵。同样,尺寸越固定,编译器就越能生成有效的代码。

答案 1 :(得分:2)

您需要为值使用适当的类型,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;

答案 2 :(得分:0)

在这种情况下,虽然已经建议使用.colwise()方法,但实际上也可以使用replicate方法将向量广播到多列。

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

如果在编译时未知3,则可以编写

m -= m2.rowwise().replicate(m.cols());