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

时间:2018-10-28 16:58:54

标签: c++ eigen

如何使用模板矩阵作为输入来调用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;
  }
}

在编译过程中失败:

  

错误:[lpNorm函数的右括号]之前的预期主表达式

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

**在7月23日的发行版中刷新了本征后,出现以下错误:

  

错误:类型为“”和“ const int”的无效操作数为二进制“ operator <”              A = A.transpose()。cwiseQuotient(A.rowwise()。lpNorm

())。transpose();

显然,lpNorm没有解决;但是,我包含了Eigen/Dense,标准的.norm()也可以使用。

无论我使用哪种配置,它都不起作用。

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

1 个答案:

答案 0 :(得分:3)

如果模板中包含以下代码,其中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'

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