本征:如何用 1 和 0 代替矩阵正值?

Eigen: how can I substitute matrix positive values with 1 and 0 otherwise?

我想在Eigen中编写如下matlab代码(其中KpxpWpxb):

H = (K*W)>0;

然而,到目前为止我唯一想到的是:

H = ((K*W.array() > 0).select(1,0)); 

此代码无法像 here 所解释的那样工作,但是将 0 替换为 VectorXd::Constant(p,0)(如 link 问题中所建议的那样)会产生运行时错误:

Eigen::internal::variable_if_dynamic<T, Value>::variable_if_dynamic(T) [with T = long int; int Value = 1]: Assertion `v == T(Value)' failed.

我该如何解决这个问题?

您不需要 .select()。您只需要将 bool 的数组转换为 H 的组件类型的数组。

H = ((K * W).array() > 0.0).cast<double>();

您最初的尝试失败了,因为您的常量 1/0 数组的大小与 H 的大小不匹配。当 HMatrixXd 时,使用 VectorXd::Constant 不是一个好的选择。你也有括号的问题。我想你想要 * 而不是 matlab 符号中的 .*

#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;

int main() {
  const int p = 5;
  const int b = 10;
  MatrixXd H(p, b), K(p, p), W(p, b);
  K.setRandom();
  W.setRandom();
  H = ((K * W).array() > 0.0).cast<double>();
  std::cout << H << std::endl << std::endl;

  H = ((K * W).array() > 0).select(MatrixXd::Constant(p, b, 1),
                                   MatrixXd::Constant(p, b, 0));
  std::cout << H << std::endl;
  return 0;
}

在模板中调用模板成员函数时,需要使用template关键字。

#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;

template<typename Mat, typename Vec>
void createHashTable(const Mat &K, Eigen::MatrixXi &H, Mat &W, int b) {
  Mat CK = K;
  H = ((CK * W).array() > 0.0).template cast<int>();
}

int main() {
  const int p = 5;
  const int b = 10;
  Eigen::MatrixXi H(p, b);
  Eigen::MatrixXf W(p, b), K(p, p);
  K.setRandom();
  W.setRandom();
  createHashTable<Eigen::MatrixXf, Eigen::VectorXf>(K, H, W, b);
  std::cout << H << std::endl;
  return 0;
}

查看此内容以获得一些解释。