再议动态二维数组,通过一句表达式完成矩阵的转置
先来回顾一下通常动态二维数组的创建过程,这里以 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 ...
最新文章
- linux下 chown命令
- CV书单-Benjio PAMI review (up tp 2013)
- 曲线抽稀 java_Python实现曲线点抽稀算法
- x shell 配置 和相关注意点(vm相关注意点)
- Mips TLB miss异常
- java系统时间怎么获取,java目前系统时间的获取
- SharePoint 2007 做Migration后用户处理
- 同理心是通往成功架构的桥梁
- 2019优质公众号大盘点,果断收藏了慢慢看吧 ~
- 【Java】Object转换为String的三种策略总结
- ACM MM 2022 Call for Papers
- element ui border表头设置背景颜色
- supesite 更换目录或者域名操作方法
- word2019加载mathtype
- Ms08067红队学员 “红蓝实战对抗”报告
- ps--修饰人像的皮肤瑕疵的步骤
- python oserror 22_Python3 (Win10) 打开文件报错OSError: [Errno 22]
- AMiner推荐论文:Strongly coupled N-doped graphene quantum dots/Ni(Fe)OxHy electrocatalysts with accelerat
- 计算机类软件工程与测绘类遥感专业的薪水,2018遥感科学与技术专业就业前景和就业方向分析...
- 不同域名间的session共享
热门文章
- beaTunes5的关键词的检测分析
- SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能(六)
- 蓝桥杯——基础练习之字母图形
- linux系统中配置NFS实现文件共享
- 扔掉JUnit,迎接Spock
- 在自定义类中使用HttpContext和Page等对象的方法
- Java JDBC中的Statement和PreparedStatement
- Mac安装和配置Tomcat的教程
- 勒索老黄未果!黑客公布英伟达核心源代码,超40万个文件、75GB机密数据
- 这首歌,竟然是AI生成的,太狠了...