我是按照以下方式做到的
Mat temp, rp;
for (int i = 0; i <= descriptors1.rows - 1; i++)
{
normalize(descriptors1.row(i), temp);
rp = normd1.rowRange(i, i+1);
temp.copyTo(rp);
}
上面的描述符1是Mat。
但使用循环非常耗时。有没有更好的方法来做到这一点?
问候。
答案 0 :(得分:1)
循环没有问题。与你在Matlab中听到的不一样,它们在C ++中并不慢!如果要在非常时间敏感的应用程序中使用它,那么您可以优化循环以在每次迭代中删除i <= descriptors1.rows - 1
检查。使用temp
也是不必要的,您可以直接将normd1.rowRange
传递给normalize
以节省时间,只需一行即可。
修改:您可以使用此方法normalize(A.row(i), _OutputArray(B.ptr(i), B.cols))
或_OutputArray
的模板版本。在每次迭代中编写循环的方式descriptors1.rows - 1
应该进行评估,因为编译器看到rows
不是常量,并且很可能不理解循环中的函数不会改变它。所以我会改为:
for (i = descriptors1.rows - 1; i >= 0; i--)
但是,您需要检查编译器生成的代码以确保它已经过优化,并且还要考虑循环展开。如果这真的是代码的瓶颈,那么谷歌可以找到很多关于优化循环的材料。