二维数组转一维数组提升效率方法

一.C语言中二维数组转一维数组

   在数据量的情况下转换,不同转换方法效率差异还是很大的,尤其是在百万点以上的数据处理。

变量定义:

  #define LEN_WIN 2000

  #define LEN_VAR 10000

  double pectrum_t[3e8];

  double two_pectrum[2000][10000];

1.情况一

  目的:把arry_pectrum内的数据按行存储到pectrum_t中。

       for(int i=0;i<LEN_VAR;i++)

       {

            for(int j=0;j<LEN_WIN;j++)

            {

               pectrum_t[k] = two_pectrum[j][i];

            }

       }

说明:

     由于是按行转换,这种方法无法用memcpy的内存拷贝,由于每个需要拷贝的变量内存都不连续,所以数据量大的时候非常耗时

     

2.情况二

  目的:把arry_pectrum内的数据按列存储到pectrum_t中。

       for(int i=0;i<LEN_WIN;i++)

       {

            for(int j=0;j<LEN_VAR;j++)

            {

               pectrum_t[k] = two_pectrum[i][j];

            }

       }      

说明:

     由于是按列转换,地址连续,拷贝速度比较快;还可以用memcpy的内存拷贝来改进,效率更高,如下:

       for(int i=0;i<LEN_WIN;i++)

       {

          memcpy(pectrum_t+i*LEN_WIN, two_pectrum[i], LEN_VAR*sizeof(double));

       }    

       

3.实际编程中使用思路

  有时候我们会获得情况一的two_pectrum,内存拷贝方法没法用,这时候很多转换是徒劳的,但可以跳出来想一下,把情况一种的two_pectrum通过程序变换行列顺序变换一下,就迎刃而解了。

二.c++中的拷贝效率改进

1.情况一  

 变量定义:

  #include <QVector>

  #include <cstring>

  double pectrum_t[3e8];

  QVector<double> newVector;

  for (int i = 100; i <= 2000; ++i)

  {

     ewVector.append(pectrum_t[i]);

  }

  

  效率改进:

  int size=2000-100;

  newVector.resize(size);

  std::memcpy(newVector.data(), pectrum_t + 100, (size) * sizeof(double));  

  

2.情况二  

  (1)把newVector内的数据拷贝到gVector中

  QVector<double> gVector;

  QVector<double> newVector;

  拷贝方式:

  for(int i = 0; i < newVector.size(); i++)

  {

     gVector.append(newVector[i]);

  }

  

  改进方式(直接赋值即可):

  gVector = newVector;    

  

 (2)移动用法:

  gVector = std::move(newVector);

  注意:使用移动赋值(C++11 及以上),移动赋值后,newVector 将不再包含有效的数据,因此不应再使用它。

上一篇:Nuxt.js 应用中的 listen 事件钩子详解


下一篇:EMNLP 2024 BoF 活动报名:用 Embeddings、Reranker、小型语言模型打造更优搜索!