Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
犰狳库是否会减慢矩阵运算的执行速度? 我已经把MATLAB代码转换成C++来加速它,使用ARMADILO库来处理C++中的矩阵运算,但令人惊讶的是它比MATLAB代码慢10倍!p>_C++_Performance_Visual C++_Armadillo - Fatal编程技术网

犰狳库是否会减慢矩阵运算的执行速度? 我已经把MATLAB代码转换成C++来加速它,使用ARMADILO库来处理C++中的矩阵运算,但令人惊讶的是它比MATLAB代码慢10倍!p>

犰狳库是否会减慢矩阵运算的执行速度? 我已经把MATLAB代码转换成C++来加速它,使用ARMADILO库来处理C++中的矩阵运算,但令人惊讶的是它比MATLAB代码慢10倍!p>,c++,performance,visual-c++,armadillo,C++,Performance,Visual C++,Armadillo,所以我测试了犰狳图书馆看看这是不是原因。下面的代码是一个简单的测试代码,它初始化两个矩阵,将它们相加,并将结果保存到一个新矩阵中。一段代码使用Armadillo库,另一段不使用。使用犰狳的部分速度太慢(请注意经过的时间) 它真的减慢了执行速度(尽管它应该加快执行速度),还是我遗漏了什么 #包括 #包括 #包括 #包括 使用名称空间std; 使用arma; int main() { 自动启动=标准::时钟::高分辨率时钟::现在(); 双a[100][100]; 双b[100][100]; 双c[

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

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

#包括
#包括
#包括
#包括
使用名称空间std;
使用arma;
int main()
{
自动启动=标准::时钟::高分辨率时钟::现在();
双a[100][100];
双b[100][100];
双c[100][100];
对于(int i=0;i<100;i++)
{
对于(int j=0;j<100;j++)
{
a[i][j]=1;
b[i][j]=1;
c[i][j]=a[i][j]+b[i][j];
}
}
自动完成=标准::时钟::高分辨率时钟::现在();
std::chrono::持续时间=完成-开始;

STD:CUT< P>我相信问题来自于你根本不使用犰狳。你唯一使用它来创建比普通的2D C++数组更复杂的变量,但实际上没有更多。A犰dio可以为你做的是非常快的矩阵运算,如<代码> C1= A1+B1;,没有循环。< /P>
但是如果你只是把它写成一个elemetwise操作,你就不会使用armadillo。这与使用MATLAB进行矩阵乘法是一样的,但是你自己编写矩阵乘法。那么你就不会使用MATLAB的库了!

我相信问题来自于你根本没有使用armadillo。你唯一使用它来创建varIILE比普通的2D C++数组复杂得多,但实际上没有更多。A犰dio可以为你做的是非常快的矩阵运算,如<代码> C1= A1+B1;< /C> >,没有循环。< /P>
但是如果你只是把它写成一个elemetwise操作,你就不用犰狳了。这和用MATLAB进行矩阵乘法是一样的,只是你自己写矩阵乘法。那么你就不用MATLAB的库了!

首先要确保启用了
blas
lapack
库e是位于的说明。 第二件事是,它可能是犰狳中更广泛的内存分配

#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;
}
我用(在Ubuntu 17.10中)编译了它:
g++prog.cpp-larmadillo

首先确保启用了
blas
lapack
库,并在中提供了说明。 第二件事是,它可能是犰狳中更广泛的内存分配

#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;
}
我用(在Ubuntu 17.10中)编译了它:
g++prog.cpp-larmadillo

可能重复@Wolfie感谢提供的链接,我已经检查过了,但我想问的是犰狳库是否会像我所附的代码那样减慢代码的速度。为什么你要使用库来帮助矩阵运算,然后手动完成矩阵运算?从MATLAB的角度来看,我不知道,但是你肯定想在使用犰狳时消除循环,并且做<代码>垫C1= A1+B1< /代码>?你的代码没有MATLAB,它与MATLAB的关系如何?@ Ma2014不是在C++中开发MATLAB代码,它是用C++做数学,与MATLAB没有关系。stest代码是用于矩阵运算的,因为它在引擎盖下使用了高度优化的库。如果你认为你可以编写比MATLAB更快的线性代数代码,要么你错了,要么你可以变得非常丰富。我打赌这是第一个;)可能重复的@Wolfie感谢提供的链接,我已经检查过了,但我想问的是arm是否adillo库可能会减慢代码的速度,就像我所附的代码一样。为什么您要使用库来帮助矩阵运算,然后手动完成矩阵运算?从MATLAB的角度来看,我不知道,但您肯定想在使用Armadillo和do
mat c1=a1+b1
时消除循环?您的代码没有mat实验室,它与MATLAB的关系是什么?@ MAH2014不是在C++中开发MATLAB代码,它是用C++做数学,与Matlab没有关系。而且Matlab是矩阵运算中最快的代码,因为它在引擎盖下使用了非常高的优化库。如果你认为你可以写得更快。耳朵代数代码比Matlab可以做的,要么你错了,要么你可以很丰富。我打赌它是第一个;如果我删除循环并简单地添加矩阵,它必须比不使用犰狳快,但它不是。毕竟,使用Matalo将Matlab代码转换成C++会加快它吗?我把代码替换为没有循环。@将代码从MATLAB转换为armadillo通常不会加快速度,这取决于您的问题。有时,根据手头的任务,将MATLAB转换为低级语言可以加快速度。但是armadillo专门用于线性代数运算,软件矩阵实验室做得非常好。但是没有“会更快吗”的真实答案因为它高度依赖于你的问题。所以如果我删除了循环并简单地添加矩阵,它必须比不使用犰狳快,但它不是。毕竟,使用Matalo将MATLAB代码转换成C++会加快它的速度吗?我把代码替换为没有循环。@ MAH2014 NO,将代码从Matlab转换为犰狳将不会加速它,取决于您的问题。有时,取决于手头的任务,将MATLAB转换为低级语言可以
Elapsed time: 0.000647521 s
Elapsed time: 0.000353198 s