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

don*_*lan 1 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

编译期间失败:

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

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

** 用 7 月 23 日的版本刷新我的特征后,我收到以下错误:

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

()).转置();

显然,lpNorm没有解决;但是,我已经包括Eigen/Dense,并且标准.norm()作品。

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

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

Lac*_*ack 5

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

A.rowwise().lpNorm<p>();
Run Code Online (Sandbox Code Playgroud)

template关键字是一个模板函数之前需要:

A.rowwise().template lpNorm<p>();
Run Code Online (Sandbox Code Playgroud)

请参阅在哪里以及为什么必须放置“模板”和“类型名称”关键字?.

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

另请注意,模板参数pinlpNorm<p>必须是常量表达式(在编译时计算)。似乎在你的例子中,lp_norms::level2pvalue(l)不会是一个常量表达式。