【问题标题】:Eigen Matrix Vector Division特征矩阵向量除法
【发布时间】:2018-06-28 05:47:42
【问题描述】:

我正在尝试在 Eigen 中实现 Normalizer。

它试图实现的功能如下:

Xnorm = (X - np.mean(X, axis=0))/(np.std(X, axis=0))(相当于numpy)

在主要的标准化步骤中,我有一个功能如下:

typedef Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>
    matrix_eig;
typedef Eigen::Matrix<float, Eigen::Dynamic, Eigen::RowMajor> vector_eig;

matrix_eig Normalizer::Transform(const matrix_eig &X) {
  // mean_ and std_ are vector_eig types
  matrix_eig centered = X.rowwise() - mean_.transpose();
  // Below line doesnt work since '/' is not allowed for matrices
  return centered.rowwise()/std_;
}

我的问题是我该如何做centered.rowwise().array()之类的事情?

【问题讨论】:

  • 你想用centered.rowwise()/std_完成什么操作?据我所知,数学没有一个标准的方法来将一个矩阵除以另一个,所以我看不出它的意图是什么。
  • 正如我上面解释的那样,我试图简单地标准化数据(即零均值和单位标准偏差)。 Xnorm = (X - np.mean(X, axis=0))/(np.std(X, axis=0)) 是等效的 numpy 操作。
  • 不,你没有在上面解释。您刚刚说这是主要标准化步骤中的“一个功能”,但您忽略了说这个特定的“转换”应该在该步骤中完成什么。 (如果您愿意,请更清楚地说明。)无论如何,我熟悉的规范化涉及乘/除以一个标量,而不是一个向量,所以我会把它留给理解你在说什么的人。跨度>
  • 当然,我已经在问题中添加了描述。感谢您的建议。

标签: c++ eigen eigen3


【解决方案1】:

问题:

我该怎么做centered.rowwise().array()之类的事情

答案很简单:

centered.array().rowwise()

因此,您应该将除法写为:

return centered.array().rowwise() / std_.array();

顺便说一句,vector_eig 的定义也有错误。如果你想要一个行向量,那么它是:

typedef Eigen::Matrix<float, 1, Eigen::Dynamic> vector_eig;

或者简单地说:

typedef Eigen::RowVectorXf vector_eig;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-27
    • 2011-12-05
    • 2018-10-12
    • 2011-09-29
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多