当前位置: 首页 > article >正文

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

一.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 将不再包含有效的数据,因此不应再使用它。


http://www.kler.cn/a/385540.html

相关文章:

  • 番外:MySQL的一些事务处理
  • 《硬件架构的艺术》笔记(一):亚稳态
  • linux rocky 9.4部署和管理docker harbor私有源
  • 尤雨溪都点赞的测试工具,你还不用?
  • day12:版本控制器
  • JavaScript 正则表达式详解
  • 【原创】关于触摸芯片的那些事
  • 鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
  • ML1:sklearn env
  • OpenGL 进阶系列06 - OpenGL变换反馈(TransformFeedback)
  • SQL EXISTS谓词
  • 论文阅读——Pan-sharpening via conditional invertible neural network
  • 使用 Yocto 进行 OpenSTLinux 系统的构建
  • 深度学习⑨GANs
  • 图神经网络(GNN)入门笔记(2)——从谱域理解图卷积,ChebNet和GCN实现
  • 矩阵起源 CEO 王龙出席 1024 超互联(苏州)总部节点发布会
  • 【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (二)
  • 【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】试卷(3)
  • 代码中的设计模式-策略模式
  • 基于地铁刷卡数据分析与可视化——以杭州市为例(二)
  • github使用基础
  • c-正序或逆序输出数位
  • 走进算法大门---双指针问题(一)
  • 7.1、实验一:RIPv1配置
  • 【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】试卷(4)
  • 传统POE供电P1摄像头实现