首页 > 解决方案 > 如何在 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 秒?非常慢。

标签: c++opencvc++11stdvectormat

解决方案


好吧,你的想法是错误的。

  1. 为什么你的程序很慢:

您的 CPU 必须遍历大量数字并进行计算。这将使计算复杂度很高。这就是为什么它很慢。您的程序速度与 Mat A 和 B 的大小成正比。您可以通过减小/增加 Mat A 和 B 的大小来检查这一点。

  1. 我们可以通过 std::vector 加速它吗

对不起,但不是。使用 std::vector 不会降低计算复杂度。opencv 的数学算法是“最好的”,重写只会导致代码变慢。

  1. 如何加速计算:需要开启opencv的加速选项

您可以在以下位置看到它:https ://github.com/opencv/opencv/wiki/CPU-optimizations-build-options 。英特尔提供英特尔 mkl 库来加速矩阵计算。你可以先试试。

就个人而言,最简单的方法是使用 GPU。但是你的机器没有 GPU,所以不在此范围内。


推荐阅读