动态数组

1.变长一维数组   
  这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做: 

   1:    //文件名:   array01.cpp 

   2:    #include<iostream> 

   3:    using   namespace   std; 

   4:    int   main() 

   5:    { 

   6:      int   len; 

   7:      cin>>len; 

   8:      //用指针p指向new动态分配的长度为len*sizeof(int)的内存空间 

   9:      int   *p=new   int[len]; 

  10:      ........... 

  11:      delete[]   p; 

  12:      return   0; 

  13:    } 

  注意int   *p=new   int[len];这一句,你不能这样做:   
  int   p[len];   
  C++编译器会报错说len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定。而且这样也不行:   
  int   p[]=new   int[len];   
  编译器会说不能把int*型转化为int[]型,因为用new开辟了一段内存空间后会返回这段内存的首地址,所以要把这个地址赋给一个指针,所以要用int   *p=new   int[len];   
  array01.cpp实现了一个变长的一维数组,但是要养成一个好习惯,就是注意要注销指针p,使程序释放用new开辟的内存空间。   
  当然使用C++标准模版库(STL)中的vector(向量)也可以实现变长数组: 

   1:    //文件名:   array02.cpp 

   2:    #include<iostream> 

   3:    #include<vector> 

   4:    using   namespace   std; 

   5:    int   main() 

   6:    { 

   7:      int   len; 

   8:      cin>>len; 

   9:      vector<int>   array(len);//声明变长数组 

  10:      for(int   i=0;i<len;i++) 

  11:      { 

  12:        array[i]=i; 

  13:        cout<<array[i]<<"/t"; 

  14:      } 

  15:      return   0; 

  16:    } 

  这里的变长数组让我联想到了java的java.util包中的vector和C#中的ArrayList,它们也可以在各自的语言中实现变长数组。不过C++中的vector不能像C#一样有托管的垃圾回收机制回收被占用的内存空间,但是你可以在使用完vector后调用~vector()析构函数释放内存。   
  2.变长n维数组   
  变长的n维数组实现起来有些麻烦,但是在工程与软件设计应用中常使用的是二维数组,所以在这里着重介绍变长的二维数组,变长的n维数组可以按照类似的方法实现。首先看一个经典的用C实现变长二维数组的例子:  

   1:    //文件名:   array03.c 

   2:    #include     <stdio.h>     

   3:    #include     <malloc.h>     

   4:    void     main()     

   5:    {     

   6:                          int     x,y,i,j;     

   7:                          float     **a,*b;     

   8:                                                  printf("请输入你所求解的线性方程组的行数x:x=");     

   9:                          scanf("%d",&x);     

  10:                                                  printf("请输入你所求解的线性方程组的列数y:y=");     

  11:                          scanf("%d",&y);     

  12:                  a=(float     **)malloc(sizeof(float     *)     *x);     

  13:                  b=(float     *)malloc(sizeof(float)     *x);     

  14:                          for(i=0;i<x;i++)     

  15:                          {     

  16:                                                  *(a+i)=(float     *)malloc(sizeof(float)     *y);      

  17:                          }     

  18:    /*读入数据*/     

  19:                          printf("请按行的顺序依次输入系数的值(共%d项):",x*y);     

  20:                          for(i=0;i<=x-1;i++)     

  21:                                                  for(j=0;j<=y-1;j++)     

  22:                                                                          scanf("%f",&a[i][j]);     

  23:                          printf("请按列的顺序依次输入常数的值(共%d项):",x);     

  24:                          for(j=0;j<=x-1;j++)     

  25:                                                                          scanf("%f",&b[j]);     

  26:                          printf("您输入方程组的增广矩阵为:/n");     

  27:                          for(i=0;i<=x-1;i++)     

  28:                          {     

  29:                                                  for(j=0;j<=y-1;j++)     

  30:                                                                          printf("%.5f         ",a[i][j]);     

  31:                                                  printf("%.5f         ",b[i]);     

  32:                                                  printf("/n");     

  33:                          }     

  34:                          free(b);     

  35:                          for(i=0;i<x;i++)     

  36:                                                  free     (*(a+i));   

  37:    } 

  那么用C++怎样实现呢?在C++中可以通过new和delete运算符动态开辟和释放空间,其中new与C中malloc函数的功能相似,delete与C中free函数的功能相似。用C++实现变长二维数组时可以采用两种方法:双指针方法和使用STL中vector(向量)的方法。   
  首先介绍一下双指针方法,在这里双指针就是指像指针的指针,比如你可以这样声明一个数组:   
  int   **p   =   new   int*[num1];   
  而对每一个*p(一共num1个*p)申请一组内存空间:   
  for(int   i=0;   i<num1;   ++i)   
    p[i]   =   new   int[num2];   
  其中,num1是行数,num2是数组的列数。测试的源程序如下:   
 

   1:   //文件名:   array04.cpp 

   2:    #include   <iostream> 

   3:    #include   <iomanip> 

   4:    using   namespace   std; 

   5:    int   main() 

   6:    { 

   7:      int   num1,//行数 

   8:              num2;//列数 

   9:      cout<<"Please   enter   the   number   for   row   and   column:   "<<endl; 

  10:      cin   >>   num1   >>   num2; 

  11:      //为二维数组开辟空间 

  12:      int   **p   =   new   int*[num1]; 

  13:      for(int   i=0;   i<num1;   ++i) 

  14:        p[i]   =   new   int[num2]; 

  15:      for(int   j=0;j<num1;j++) 

  16:      { 

  17:        for(int   k=0;k<num2;k++) 

  18:        { 

  19:          p[j][k]=(j+1)*(k+1); 

  20:          cout<<setw(6)<<p[j][k]<<':'<<setw(8)<<&p[j][k]; 

  21:        } 

  22:        cout<<endl; 

  23:      } 

  24:      //释放二维数组占用的空间 

  25:      for(int   m=0;m<num1;m++) 

  26:        delete[]   p[m]; 

  27:      delete[]   p; 

  28:      return   0; 

  29:    } 

  以下是运行结果:   
  Please   enter   the   number   for   row   and   column:   
  4   5   
            1:004915F0           2:004915F4           3:004915F8           4:004915FC           5:00491600   
            2:00491180           4:00491184           6:00491188           8:0049118C         10:00491190   
            3:00491140           6:00491144           9:00491148         12:0049114C         15:00491150   
            4:00491100           8:00491104         12:00491108         16:0049110C         20:00491110   
  Press   any   key   to   continue   
  程序清单array04.cpp可以显示分配的内存空间单元的地址,大家可以看到,由于数组空间是动态分配的,数组行之间的地址空间是不连续的,因为不同行的数组元素的地址空间是用不同的new来分配的。而每一行之中列之间的地址空间是连续的。   
  那么用vector(向量)怎样实现二维数组呢?以下给出源程序:   
 

   1:   //文件名:   array05.cpp 

   2:    #include   <iostream> 

   3:    #include   <vector> 

   4:    #include   <iomanip> 

   5:    using   namespace   std; 

   6:    int   main() 

   7:    { 

   8:      int   i, 

   9:              j, 

  10:              m,   //行数 

  11:              n;   //列数 

  12:      cout   <<   "input   value   for   m,n:"; 

  13:      cin>>m>>n; 

  14:      //注意下面这一行:vector<int后两个">"之间要有空格!否则会被认为是重载">>"。 

  15:      vector<vector<int>   >   vecInt(m,   vector<int>(n));     

  16:      for   (i   =   0;   i   <   m;   i++) 

  17:        for   (j   =   0;   j   <   n;   j++) 

  18:          vecInt[i][j]   =   i*j;   

  19:      for   (i   =   0;   i   <   m;   i++) 

  20:      { 

  21:        for   (j   =   0;   j   <   n;   j++) 

  22:          cout<<setw(5)<<vecInt[i][j]<<":"<<setw(9)<<&vecInt[i][j]; 

  23:        cout<<endl; 

  24:      }     

  25:      return   0; 

  26:    } 

  以下是运行结果:   
  input   value   for   m,n:3   4   
          0:   00491180         0:   00491184         0:   00491188         0:   0049118C   
          0:   00491140         1:   00491144         2:   00491148         3:   0049114C   
          0:   00491100         2:   00491104         4:   00491108         6:   0049110C   
  Press   any   key   to   continue   
  大家可以看到,这里vector中元素的内存的地址分配也有同双指针实现的二维数组有同样的特点。不过用vector的方法比使用双指针简单地多,分配内存空间时会更安全,数组初始化代码也更简单,所以本人建议使用STL中的vector来实现变长多维数组。以下是一个变长三维数组:)  

   1:    //文件名:   array06.cpp 

   2:    #include   <iostream> 

   3:    #include   <vector> 

   4:    #include   <iomanip> 

   5:    using   namespace   std; 

   6:    int   main() 

   7:    { 

   8:      int   i, 

   9:        j, 

  10:        k, 

  11:        m,   //一维坐标 

  12:        n,   //二维坐标 

  13:        l;   //三维坐标         

  14:      cout   <<   "input   value   for   m,n,l:"; 

  15:      cin>>m>>n>>l; 

  16:      vector<vector<vector<int>   >   >   vecInt(m,   vector<vector<int>   >(n,   vector<int>(l)));     

  17:      for   (i   =   0;   i   <   m;   i++) 

  18:        for   (j   =   0;   j   <   n;   j++) 

  19:          for(k   =   0;   k   <   l;   k++) 

  20:            vecInt[i][j][k]   =   i+j+k;   

  21:      for   (i   =   0;   i   <   m;   i++) 

  22:      { 

  23:        for   (j   =   0;   j   <   n;   j++) 

  24:        { 

  25:          for(k   =   0;   k<l;   k++) 

  26:            cout<<setw(5)<<vecInt[i][j][k]<<":"<<setw(9)<<&vecInt[i][j][k]; 

  27:          cout<<endl; 

  28:        } 

  29:        cout<<endl; 

  30:      } 

  31:      return   0; 

  32:    } 

  运行结果:   
  input   value   for   m,n,l:2   3   4   
          0:   00492FE0         1:   00492FE4         2:   00492FE8         3:   00492FEC   
          1:   00492FA0         2:   00492FA4         3:   00492FA8         4:   00492FAC   
          2:   00492F60         3:   00492F64         4:   00492F68         5:   00492F6C   
          1:   00492EC0         2:   00492EC4         3:   00492EC8         4:   00492ECC   
          2:   00492E80         3:   00492E84         4:   00492E88         5:   00492E8C   
          3:   00492E40         4:   00492E44         5:   00492E48         6:   00492E4C

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
应用背景为变电站电力巡检,基于YOLO v4算法模型对常见电力巡检目标进行检测,并充分利用Ascend310提供的DVPP等硬件支持能力来完成流媒体的传输、处理等任务,并对系统性能做出一定的优化。.zip深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如间序列或自然语言,因为它们具有记忆功能,能够捕捉数据间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值