先来回顾一下通常动态二维数组的创建过程,这里以 m×n int数组为例

 int **pp=new int*[m];for(int i=0;i<m;++i)*(pp+i)=new int[n];//通过*(*(pp+i)+j)操作数组元素(i,j)for(i=0;i<m;++i)delete [] *(pp+i);delete [] pp;

这样的方式称为离散动态数组,主要存在两个缺点:

1. 数组储存区不连续;

2. 堆上空间释放比较麻烦。

图中以m=4,n=3为例。

所以我们寻求更好的代码:

  int *p=new int[m*n];int **pp=new int*[m];for(int i=0;i<m;++i)*(pp+i)=p+i*n;delete [] pp;delete [] p;

同样通过 *(*(pp+i)+j) 访问数组成员(i,j),先申请一段连续的空间,然后让指针数组保存它们的地址。

图中,m=4,n=3,这样做有两个好处:

1. 空间的释放更方便了;

2. 可以重新操作这段空间组成新数组。相较于第一种方式,其额外的开销仅是一个int*变量。

比如要把m×n个int所组成的空间段重分配为k×j的数组:

   delete [] pp;pp=new int*[k];for(int i=0;i<k;++i)*(pp+i)=p+i*j;

图中,以k=2,j=6为例。

通过观察代码,不难发现对于任意的i,都有

     *(pp+i)=p+i*n;

那么此时对于二维数组的操作事实上不需要二级指针的参与,只需一句表达式即可以用元素(i,j):

   int *p=new int[m*n];//*(p+i*n+j)——(i,j)delete [] p;

其实矩阵这个概念本来就是抽象的,把一个串拆分下并列着放就是矩阵了。对于这样的存储方式,可以很轻松的完成其转置,只要换一种引用方式:

*(p+i+j*n)

即可完成矩阵的“转置”操作。事实上根本没有矩阵,存在的只是在内存中的一块连续空间而已,不同的访问方式显示了这块内存段在我们大脑中不同的映射。

这里并不是按常规的思维方式,先形成一个二维数组,如A(m,n),然后填充,而是创建一个串,按某种规则写入数据,按某种规则读取数据。对于普通的矩阵操作,其读写规则为同一种。

而对于一个矩阵转置问题,其本质是,按某种规则写入数据,按另一种规则读取数据,而这两种规则的不同点反映出矩阵转置的概念。内存段没变,变的是它在我们大脑中映射的矩阵,或者更准确的说是映射的规则变了。

转载于:https://www.cnblogs.com/silyvin/archive/2012/02/03/9106915.html

再议动态二维数组,通过一句表达式完成矩阵的转置相关推荐

  1. C++建立动态二维数组

    C++建立动态二维数组主要有两种方法: 1.使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组            int **b=new int*[row ...

  2. C++——C++创建动态二维数组+memset()函数初始化

    C++开辟动态二维数组的几种方法总结 原文链接:https://blog.csdn.net/xiang_shao344/article/details/99684395 一.用 new 来动态开辟一个 ...

  3. C++动态二维数组演示的代码

    将代码过程中经常用到的代码珍藏起来,下边资料是关于C++动态二维数组演示的代码. #include <iostream> #include <string>using name ...

  4. 动态二维数组赋值及for循环遍历和toString遍历

    package com.Summer_0421.cn;import java.util.Arrays;/*** @author Summer* 动态二维数组赋值及for循环遍历和toString遍历* ...

  5. C语言实现动态二维数组及相乘

    一.二维数组的概念  1.二维数组本质上是以数组作为数组元素的数组,即数组的数组. 2.二维数组就是一个有行和列的矩阵,每一行代表一个数组,即数组的数组. 3.每一行数组内元素所在的位置可以用行和列号 ...

  6. C++之定义动态二维数组

    C++之定义动态二维数组 直接上代码 #include"stdio.h" #include<iostream> using namespace std; int mai ...

  7. java创建动态二维数组

    java创建动态二维数组 //声明Scanner对象,获取键盘输入值Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = s ...

  8. 二维动态数组空间分配 c语言,科学网—C语言中动态二维数组的使用和分配 - 王一哲的博文...

    好多年不用C语言了,最后一次使用还是读研的时候写矩量法的时候了,看见VS的界面总能想起当年读书的时候的各种错误,往事随风.本程序应人之约,首先得到一个随机的矩阵,之后通过将矩阵分解为几个小矩阵统计小矩 ...

  9. pb 创建动态二维数组

    pb中二维数组定义:array[10,10] 定义出来的二维数组是固定长度的:无法像一维数组一样动态长度:那PB中如何创建动态二维数组,请看接下来的内容. 1.先创建结构体structure 2.结构 ...

  10. python课程设计矩阵对角线之和_Python二维数组实现求出3*3矩阵对角线元素的和示例...

    Python二维数组实现求出3*3矩阵对角线元素的和示例 题目:求一个3*3矩阵对角线元素之和. 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出. def two_dime ...

最新文章

  1. linux下 chown命令
  2. CV书单-Benjio PAMI review (up tp 2013)
  3. 曲线抽稀 java_Python实现曲线点抽稀算法
  4. x shell 配置 和相关注意点(vm相关注意点)
  5. Mips TLB miss异常
  6. java系统时间怎么获取,java目前系统时间的获取
  7. SharePoint 2007 做Migration后用户处理
  8. 同理心是通往成功架构的桥梁
  9. 2019优质公众号大盘点,果断收藏了慢慢看吧 ~
  10. 【Java】Object转换为String的三种策略总结
  11. ACM MM 2022 Call for Papers
  12. element ui border表头设置背景颜色
  13. supesite 更换目录或者域名操作方法
  14. word2019加载mathtype
  15. Ms08067红队学员 “红蓝实战对抗”报告
  16. ps--修饰人像的皮肤瑕疵的步骤
  17. python oserror 22_Python3 (Win10) 打开文件报错OSError: [Errno 22]
  18. AMiner推荐论文:Strongly coupled N-doped graphene quantum dots/Ni(Fe)OxHy electrocatalysts with accelerat
  19. 计算机类软件工程与测绘类遥感专业的薪水,2018遥感科学与技术专业就业前景和就业方向分析...
  20. 不同域名间的session共享

热门文章

  1. beaTunes5的关键词的检测分析
  2. SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能(六)
  3. 蓝桥杯——基础练习之字母图形
  4. linux系统中配置NFS实现文件共享
  5. 扔掉JUnit,迎接Spock
  6. 在自定义类中使用HttpContext和Page等对象的方法
  7. Java JDBC中的Statement和PreparedStatement
  8. Mac安装和配置Tomcat的教程
  9. 勒索老黄未果!黑客公布英伟达核心源代码,超40万个文件、75GB机密数据
  10. 这首歌,竟然是AI生成的,太狠了...