博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再议动态二维数组,通过一句表达式完成矩阵的转置
阅读量:4691 次
发布时间:2019-06-09

本文共 971 字,大约阅读时间需要 3 分钟。

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

int **pp=new int*[m];	for(int i=0;i
这样的方式称为离散动态数组,主要存在两个缺点:

1. 数组储存区不连续;

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

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

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

int *p=new int[m*n];	int **pp=new int*[m];	for(int i=0;i
同样通过 *(*(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=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

你可能感兴趣的文章
7.1 Varnish VCL
查看>>
C#+Winform开发窗体程序
查看>>
简练软考知识点整理-规划干系人管理
查看>>
centeros iptable模板文件
查看>>
Ajax的原理和应用 (转载,资料收集,整理)
查看>>
tomcat用root权限也起不来
查看>>
黑马程序员2-成员变量的封装及类方法
查看>>
SprintBoot 实现上传下载
查看>>
笔记:非科班出身的我,如何成为了UI设计师
查看>>
关于C#堆栈的几点说明
查看>>
我们应该去努力推动每一件有利于这个社会的一些事情
查看>>
flutte项目命令行打包
查看>>
HDU-2577 How to Type(递推,DP)(水)2017寒假集训
查看>>
SQL数据库开发知识总结:提高篇
查看>>
jsp基础语言-jsp注释
查看>>
Cocos2d-x mac下eclipse开发环境的搭建, 创建跨平台的cocos2dx项目
查看>>
Java学习 · 初识 面向对象基础一
查看>>
也谈WebKit、Gecko使用图形库
查看>>
Could not write file: C:\......\.classpath
查看>>
css里关于浏览器的前缀
查看>>