c++ - 如何在 c++11 中使用 std::vector 使其更快?
问题描述
我有 cv::Mat Mat_A 和 cv::Mat Mat_B 都是 (800000 X 512) 浮点数
下面的代码看起来很慢。
int rows = Mat_B.rows;
cv::Mat Mat_A = cv::repeat(img, rows, 1, Mat_A);
Mat_A = Mat_A - Mat_B
cv::pow(Mat_A,2,Mat_A)
cv::reduce(Mat_A, Mat_A, 1, CV_REDUCE_SUM);
cv::minMaxLoc(Mat_A, &dis, 0, &point, 0);
如何在 std::vector 中执行此操作?
我认为它应该更快。
在我的 2.4 Ghz mabook pro 中需要 4 秒?非常慢。
解决方案
好吧,你的想法是错误的。
- 为什么你的程序很慢:
您的 CPU 必须遍历大量数字并进行计算。这将使计算复杂度很高。这就是为什么它很慢。您的程序速度与 Mat A 和 B 的大小成正比。您可以通过减小/增加 Mat A 和 B 的大小来检查这一点。
- 我们可以通过 std::vector 加速它吗
对不起,但不是。使用 std::vector 不会降低计算复杂度。opencv 的数学算法是“最好的”,重写只会导致代码变慢。
- 如何加速计算:需要开启opencv的加速选项
您可以在以下位置看到它:https ://github.com/opencv/opencv/wiki/CPU-optimizations-build-options 。英特尔提供英特尔 mkl 库来加速矩阵计算。你可以先试试。
就个人而言,最简单的方法是使用 GPU。但是你的机器没有 GPU,所以不在此范围内。
推荐阅读
- javascript - 模板文字函数传递的问题
- rust - 为什么在 .split() 之后我得到一个空的 &str?
- c - xv6 makefile 表示对 __printf_chk 的未定义引用
- java - 导航到特定的 JSON 节点并使用 ObjectMapper
- ruby - 在 Gitlab 的“config.ru”中,如果已经定义,为什么“需要‘独角兽’”?
- flutter - Flutter 中缺少如何从 Firestore 读取和管理案例数据
- jquery - 如何减少具有相同功能但事件不同的 Jquery 代码
- java - 使用 Logger 将堆栈跟踪写入文件产生空文件
- c# - c# - URL中的httpWebRequest授权问题
- binary-tree - n 个节点的二叉树的最大叶节点数和最小叶节点数是多少?