犰狳库会减慢矩阵运算的执行速度吗?

Does armadillo library slow down the execution of a matrix operations?

我已经将 MATLAB 代码转换为 C++ 以加快速度,使用 Armadillo 库处理 C++ 中的矩阵运算,但令人惊讶的是它比 MATLAB 代码慢 10 倍!

所以我测试了 Armadillo 库,看看是否是这个原因。下面的代码是一个简单的测试代码,它初始化两个矩阵,将它们相加并将结果保存到一个新矩阵中。一段代码使用了 Armadillo 库,另一段则没有。使用犰狳的部分太慢了(注意经过的时间)。

它真的会减慢执行速度(尽管它应该会加快执行速度)还是我遗漏了什么?

#include<iostream>
#include<math.h>
#include<chrono>
#include<armadillo>
using namespace std;
using namespace arma;
int main()
 {
   auto start = std::chrono::high_resolution_clock::now();
   double a[100][100];
   double b[100][100];
   double c[100][100];
   for (int i = 0; i < 100; i++)
     {
       for (int j = 0; j < 100; j++)
         {
           a[i][j] = 1;
           b[i][j] = 1;
           c[i][j] = a[i][j] + b[i][j];
         }
     }

     auto finish = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = finish - start;
    std::cout << "Elapsed time: " << elapsed.count() << " s\n";
    auto start1 = std::chrono::high_resolution_clock::now();
    mat a1=ones(100,100);
   mat b1=ones(100,100);
   mat c1(100,100);
   c1 = a1 + b1;
   auto finish1 = std::chrono::high_resolution_clock::now();
   std::chrono::duration<double> elapsed1 = finish1 - start1;
   std::cout << "Elapsed time: " << elapsed1.count() << " s\n";
   return 0;


}

这是我得到的答案:

Elapsed time: 5.1729e-05 s
Elapsed time: 0.00025536 s

如您所见,Armadillo 的速度要慢得多!最好不要使用 Armadillo 库吗?

我认为问题出在您根本没有使用犰狳。您独特地使用它来创建比普通的 C++ 二维数组复杂一点的变量,但实际上仅此而已。 Armadillo 可以为您做的是为您提供非常快速的矩阵运算,如 c1=a1+b1;,没有循环。

但是,如果您只是将其编写为元素操作,那么您就没有使用犰狳。它与使用 MATLAB 进行矩阵乘法相同,但自己编写矩阵乘法。那你不是在使用 MATLAB 的库!

首先确保blaslapack库已启用,在Armadillo doc处有说明。 第二件事是它可能是犰狳中更广泛的内存分配。如果您重组代码以首先进行内存初始化,如

#include<iostream>
#include<math.h>
#include<chrono>
#include<armadillo>
using namespace std;
using namespace arma;
int main()
 {
   double a[100][100];
   double b[100][100];
   double c[100][100];
   mat a1=ones(100,100);
   mat b1=ones(100,100);
   mat c1(100,100);

   auto start = std::chrono::high_resolution_clock::now();
   for (int i = 0; i < 100; i++)
     {
       for (int j = 0; j < 100; j++)
         {
           a[i][j] = 1;
           b[i][j] = 1;
           c[i][j] = a[i][j] + b[i][j];
         }
     }
   auto finish = std::chrono::high_resolution_clock::now();
   std::chrono::duration<double> elapsed = finish - start;
   std::cout << "Elapsed time: " << elapsed.count() << " s\n";

   auto start1 = std::chrono::high_resolution_clock::now();
   c1 = a1 + b1;
   auto finish1 = std::chrono::high_resolution_clock::now();
   std::chrono::duration<double> elapsed1 = finish1 - start1;
   std::cout << "Elapsed time: " << elapsed1.count() << " s\n";

   return 0;
}

有了这个我得到了结果:

Elapsed time: 0.000647521 s
Elapsed time: 0.000353198 s

我用(在 Ubuntu 17.10 中)编译了它: g++ prog.cpp -larmadillo