如何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什么?
如果您在模板中包含此代码,其中的类型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)不会是一个常量表达式。