【发布时间】:2016-03-08 08:52:15
【问题描述】:
在使用 Armadillo 库时,我发现在处理缺失值时存在一种循环模式。例如,如果我想对矩阵的行执行var 操作并处理缺失值,我将像这样进行
void varianceRows(const mat& M,vec& v)
{
for(uint i=0;i<M.n_rows;i++) // variance calculated on rows
{
if(M.row(i).is_finite())
v(i) = var(M.row(i));
else if(!any(M.row(i)>0))
v(i) = NAN;
else
{
vec b=M.row(i);
v(i) = var(b.elem(find_finite(b)));
}
}
}
现在我意识到执行相同程序但功能不同(例如mean、median、sum 等)通常是这种情况。然后我想知道如何编写这个函数的通用版本,以便它可以接受不同的函数作为参数。我现在的尝试是:
template<typename Func>
void FuncOnMat(const mat& M,vec& v,Func func)
{
for(uint i=0;i<M.n_rows;i++) // operation calculated on rows
{
if(M.row(i).is_finite())
v(i) = func(M.row(i));
else if(!any(M.row(i)>0))
v(i) = NAN;
else
{
vec b=M.row(i);
v(i) = func(b.elem(find_finite(b)));
}
}
}
但是当我执行时
FuncOnMat(A,r,mean);
它不起作用。我觉得我需要提供一个仿函数或lambda。最好的方法是什么?
【问题讨论】:
-
当你说它不起作用时,你具体得到什么错误?
-
error: no matching function for call to 'FuncOnMat(arma::mat&, arma::vec&, <unresolved overloaded function type>)' -
那么你去吧;你的函数很好(虽然我会使用
Func const&以防你传入 lambda 或仿函数),只是mean可以引用多个重载,所以编译器不知道你是哪一个试图通过。您将 need a cast 告诉它您想要哪个(或使用 lambda 来获得更好的语法)。
标签: c++ templates c++11 lambda function-pointers