我怎么能像 numpy 那样从 MxN 矩阵中减去 1xN 特征矩阵?

How could I subtract a 1xN eigen matrix from a MxN matrix, like numpy does?

我无法像在 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中减去它,我该怎么做?

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

m.colwise() -= m2

(见Eigen tutorial on this

N.B.: m2 需要是向量,而不是矩阵。而且维度越固定,编译器生成的代码效率就越高。

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

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

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

如果编译时不知道3,可以写

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