本征:调用 lpNorm() 的正确方法

Eigen: Proper way to call lpNorm()

如何使用模板化矩阵作为输入来调用 lpNorm

这是我的代码中的问题:

template<class number>
void normalize_in_place(Matrix<number,Dynamic,Dynamic> & A, level l, axis a){

  const int p = lp_norms::level2pvalue(l);
  switch ( a ) {
    case row: 
      // TODO: get lpnorm working. 
      A = A.transpose().cwiseQuotient(A.rowwise().lpNorm<p>()).transpose();
      //A = A.transpose().cwiseQuotient(A.rowwise().norm()).transpose();
      break;
    case col:
      // TODO: get lpnorm working. 
      //A = A.cwiseQuotient(A.colwise().lpNorm<p>());
      A = A.cwiseQuotient(A.colwise().norm());
      break;
  }
}

编译期间失败:

error: expected primary expression before [ close parenthesis of lpNorm function ]

我用方括号代替了您在编译器输出中看到的箭头。

** 使用 7 月 23 日发布的版本刷新我的特征后,出现以下错误:

error: invalid operands of types ‘’ and ‘const int’ to binary ‘operator<’ A = A.transpose().cwiseQuotient(A.rowwise().lpNorm

()).transpose();

显然,lpNorm 没有解析;但是,我包含了 Eigen/Dense,并且标准的 .norm() 有效。

不管我用什么配置,都不行。

调用 lpNorm 的正确方法是什么?

如果您在模板中包含此代码,其中 A 的类型取决于模板参数:

A.rowwise().lpNorm<p>();

模板函数前需要template关键字:

A.rowwise().template lpNorm<p>();

Where and why do I have to put the "template" and "typename" keywords?

如果没有 template 关键字,GCC 会尝试将 <p> 中的 < 视为小于运算符并生成您看到的错误消息。 Clang 提供更有用的错误消息,error: missing 'template' keyword prior to dependent template name 'lpNorm'.

还要注意 lpNorm<p> 中的模板参数 p 必须是 常量表达式 (在编译时计算)。在您的示例中,lp_norms::level2pvalue(l) 似乎不是常量表达式。