本征:调用 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)
似乎不是常量表达式。
如何使用模板化矩阵作为输入来调用 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)
似乎不是常量表达式。