C++ Eigen:调用lpNorm()的正确方法
如何使用模板化矩阵作为输入调用C++ Eigen:调用lpNorm()的正确方法,c++,eigen,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 lpn
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;
}
}
模板
在适当位置(矩阵和A,l层,A轴)进行空洞规格化{
const int p=lp_范数::level2pvalue(l);
开关(a){
案例行:
//TODO:让lpnorm正常工作。
A=A.transpose().cwisecontudy(A.rowwise().lpNorm()).transpose();
//A=A.transpose().cwisecontudy(A.rowwise().norm()).transpose();
打破
案例:
//TODO:让lpnorm正常工作。
//A=A.cWise商(A.colwise().lpNorm());
A=A.cWise商(A.colwise().norm());
打破
}
}
在编译过程中失败,原因是:
错误:在[lpNorm函数的右括号]之前应为主表达式
我用括号代替了编译器输出中的箭头
**在使用7月23日的版本刷新我的eigen之后,我得到以下错误:
错误:如果模板中有此代码,且
a
的类型取决于模板参数,则类型为“”和“const int”的操作数对二进制运算符无效:
A.rowwise().lpNorm<p>();
看
没有
模板
关键字,如果模板中有代码,而a
的类型取决于模板参数,则GCC会尝试处理:
A.rowwise().lpNorm<p>();
看
在没有模板
关键字的情况下,GCC试图处理是否存在rwiseQuotient
甚至存在@是的,更新了。这仍然不是一个MCVE(如果没有级别
,轴
等的定义,怎么能编译它?),但足以回答问题。rwisecontudy
是否存在@是的,更新了。这仍然不是一个MCVE(如果没有级别
,轴
等的定义,如何编译它?),但足以回答。好的,太好了,那么你告诉我的是,我需要一个编译开关,用于所有p
值的选择,对吗?有两个部分:1<代码>模板
关键字,2p
必须是常量表达式(我刚刚添加到我的答案中)。我不知道什么是级别l
,但一个解决方案可能是将其作为模板参数。啊,好的,我看到您已经更新以回答我的问题。因此,我不可能在没有宏和重新编译的情况下,向使用Eigen lpNorm的最终用户提供lpNorm的可能范围。如果编译时不知道p
,则不可能调用Eigen的lpNorm()
。即使在您的情况下,也可能在编译时知道p
:调用的代码是否在编译时就地规范化knowl
?否则请注意,Eigen的lpNorm
模板实际上只是在几个函数之间进行选择(对于p
=1、2和无穷大的特殊情况,以及其他p
的一般情况),最坏情况下,您可以编写自己的lpNorm
版本,以检查p在运行时是否为无穷大。是的,这是我的计划。在我看来,除了1、2和无穷大之外,其他情况没有多大用处;但是一个精通数学的用户,如果不知道代码(或一般代码)是如何工作的,可能会喜欢在这些输入上乱动。所以我可以自己实现内部案例。好的,很好,那么你告诉我的是,我需要一个编译开关,用于所有p
值的选择,对吗?有两个部分:1<代码>模板
关键字,2p
必须是常量表达式(我刚刚添加到我的答案中)。我不知道什么是级别l
,但一个解决方案可能是将其作为模板参数。啊,好的,我看到您已经更新以回答我的问题。因此,我不可能在没有宏和重新编译的情况下,向使用Eigen lpNorm的最终用户提供lpNorm的可能范围。如果编译时不知道p
,则不可能调用Eigen的lpNorm()
。即使在您的情况下,也可能在编译时知道p
:调用的代码是否在编译时就地规范化knowl
?否则请注意,Eigen的lpNorm
模板实际上只是在几个函数之间进行选择(对于p
=1、2和无穷大的特殊情况,以及其他p
的一般情况),最坏情况下,您可以编写自己的lpNorm
版本,以检查p在运行时是否为无穷大。是的,这是我的计划。在我看来,除了1、2和无穷大之外,其他情况没有多大用处;但是一个精通数学的用户,如果不知道代码(或一般代码)是如何工作的,可能会喜欢在这些输入上乱动。因此,我可以自己实施内部案例。