再议动态二维数组,通过一句表达式完成矩阵的转置
先来回顾一下通常动态二维数组的创建过程,这里以 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
再议动态二维数组,通过一句表达式完成矩阵的转置相关推荐
- C++建立动态二维数组
C++建立动态二维数组主要有两种方法: 1.使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组 int **b=new int*[row ...
- C++——C++创建动态二维数组+memset()函数初始化
C++开辟动态二维数组的几种方法总结 原文链接:https://blog.csdn.net/xiang_shao344/article/details/99684395 一.用 new 来动态开辟一个 ...
- C++动态二维数组演示的代码
将代码过程中经常用到的代码珍藏起来,下边资料是关于C++动态二维数组演示的代码. #include <iostream> #include <string>using name ...
- 动态二维数组赋值及for循环遍历和toString遍历
package com.Summer_0421.cn;import java.util.Arrays;/*** @author Summer* 动态二维数组赋值及for循环遍历和toString遍历* ...
- C语言实现动态二维数组及相乘
一.二维数组的概念 1.二维数组本质上是以数组作为数组元素的数组,即数组的数组. 2.二维数组就是一个有行和列的矩阵,每一行代表一个数组,即数组的数组. 3.每一行数组内元素所在的位置可以用行和列号 ...
- C++之定义动态二维数组
C++之定义动态二维数组 直接上代码 #include"stdio.h" #include<iostream> using namespace std; int mai ...
- java创建动态二维数组
java创建动态二维数组 //声明Scanner对象,获取键盘输入值Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = s ...
- 二维动态数组空间分配 c语言,科学网—C语言中动态二维数组的使用和分配 - 王一哲的博文...
好多年不用C语言了,最后一次使用还是读研的时候写矩量法的时候了,看见VS的界面总能想起当年读书的时候的各种错误,往事随风.本程序应人之约,首先得到一个随机的矩阵,之后通过将矩阵分解为几个小矩阵统计小矩 ...
- pb 创建动态二维数组
pb中二维数组定义:array[10,10] 定义出来的二维数组是固定长度的:无法像一维数组一样动态长度:那PB中如何创建动态二维数组,请看接下来的内容. 1.先创建结构体structure 2.结构 ...
- python课程设计矩阵对角线之和_Python二维数组实现求出3*3矩阵对角线元素的和示例...
Python二维数组实现求出3*3矩阵对角线元素的和示例 题目:求一个3*3矩阵对角线元素之和. 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出. def two_dime ...
最新文章
- 理解并自定义HttpHandler
- 泛函分析1-线性空间
- 她说程序员不懂浪漫,生日宴上惨变单身狗,其实,程序员的浪漫你不懂!
- qq linux版本下载官网下载,腾讯QQ For Linux
- bv值是什么意思_BVR电线是什么意思BVR电线电缆规格型号
- Python删除文件、删除文件夹
- linux db2表空间目录,db2 表空间的一些知识
- The operation of Debian is much
- bzoj 1016: [JSOI2008]最小生成树计数
- 再问:支付宝即时到账集成接口!
- 苹果被拒:Guideline 5.0 - Legal
- Linux inittab和oracle lsntctl 启动的问题解决办法
- vue-router的编程式导航
- 用Python写前端
- staruml-uml程序员绘图工具简单使用与说明
- 微信H5活动抽奖单页面模板源码
- 【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例
- 唐伯虎的诗,可能是改编的
- 1.[QT | QCharts | 动态显示]折线图标题字体大小无法更改
- php的安装完成后为什么显示空白页?