我已经将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库吗?
答案 0 :(得分:1)
首先确保已启用blas
和lapack
库,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
答案 1 :(得分:0)
我认为问题来自于你根本不使用犰狳。您唯一地使用它来创建比C ++的普通2D数组更复杂的变量,但实际上仅此而已。 Armadillo可以为您做的是为您提供非常快速的矩阵运算,如c1=a1+b1;
中所示,没有循环。
但是如果你只是把它写成一个elemetwise操作,你就是不使用armadillo。它与使用MATLAB进行矩阵乘法相同,但自己编写矩阵乘法。您当时没有使用MATLAB的库!