三角矩阵的存储和获取(C++版)
下三角矩阵如图, 三角形区域首先被存储,框型区域最后被存储于数组的最后一个元素中。
代码及测试结果:
#include<stdio.h>
#include<stdlib.h>#define N 4 //N为三角矩阵的阶数
//先把矩阵的下三角区元素存了
void storageLowerTriangle(int array[] , int i, int j , int e){array[i*(i-1)/2+j-1] = e;
}
//再存储常数C
void storageConstant(int array[],int constant){array[N*(N+1)/2]=constant;
}//三角矩阵的元素获取
int getValue(int array[],int i,int j) {if(i>=j){//访问下三角区元素return array[i*(i-1)/2+j-1];}else{//访问上三角区的常数return array[N*(N+1)/2]; }
}int main(int argc, char *argv[])
{//用二维数组模拟一个对称矩阵. int matrix[N][N] = {{9,888,888,888},{1,6,888,888},{3,8,19,888},{5,17,11,12} };//+1是存储主对角线的上三角区域的常数C int *array =(int *)malloc(sizeof(int)*(N*(N+1)/2+1));//遍历矩阵只存储下三角元素for(int i = 0;i<N;i++){for(int j = 0;j<N;j++){//矩阵的下三角区域,存储 if(i>=j){//这里 i+1 j+1 是矩阵下标是从1开始,而不是0. matrix[0][0] 其实是矩阵中的a11. storageLowerTriangle(array,(i+1),(j+1),matrix[i][j]); }}}//存储三角矩阵的常数CstorageConstant(array,matrix[0][1]);//打印array数组中存储的元素for(int i = 0;i<N*(N+1)/2+1;i++){printf("array数组中的元素是%d\n",*(array+i));} //访问矩阵的第三行、第二个元素int value = getValue(array,3,2);printf("矩阵中的第三行第二个元素是%d\n",value);//访问矩阵的第二行、第四个元素 int value2 = getValue(array,2,4); printf("矩阵中的第二行第四个元素是%d\n",value2); return 0;
}
上三角矩阵如图, 三角形区域先被存储,框型区域后被存储。
代码及测试结果:
#include<stdio.h>
#include<stdlib.h>#define N 4 //N为三角矩阵的阶数
//先把矩阵的上三角矩阵元素存了
void storageLowerTriangle(int array[] , int i, int j , int e){array[(2*N-i+2)*(i-1)/2+(j-i)] = e;
}
//再存储常数C
void storageConstant(int array[],int constant){array[N*(N+1)/2]=constant;
}//三角矩阵的元素获取
int getValue(int array[],int i,int j) {if(i<=j){//访问上三角区元素return array[(2*N-i+2)*(i-1)/2+(j-i)];}else{//访问下三角区的常数return array[N*(N+1)/2]; }
}int main(int argc, char *argv[])
{//用二维数组模拟一个对称矩阵. int matrix[N][N] = {{9,1,3,5},{888,6,8,17},{888,888,19,11},{888,888,888,12} };//+1是存储主对角线的上三角区域的常数C int *array =(int *)malloc(sizeof(int)*(N*(N+1)/2+1));//遍历矩阵只存储上三角元素for(int i = 0;i<N;i++){for(int j = 0;j<N;j++){//矩阵的上三角区域,存储 if(i<=j){//这里 i+1 j+1 是矩阵下标是从1开始,而不是0. matrix[0][0] 其实是矩阵中的a11. storageLowerTriangle(array,(i+1),(j+1),matrix[i][j]); }}}//存储三角矩阵的常数CstorageConstant(array,matrix[1][0]);//打印array数组中存储的元素for(int i = 0;i<N*(N+1)/2+1;i++){printf("array数组中的元素是%d\n",*(array+i));} //访问矩阵的第三行、第二个元素int value = getValue(array,3,2);printf("矩阵中的第三行第二个元素是%d\n",value);//访问矩阵的第二行、第四个元素 int value2 = getValue(array,2,4); printf("矩阵中的第二行第四个元素是%d\n",value2); return 0;
}
按上三角矩阵和按下三角矩阵存储的不同就是, 存取时的表达式不同,其余代码大多数都雷同。
所以说矩阵的存储:关键是搞清楚矩阵下标和数组下标的映射关系。
三角矩阵的存储和获取(C++版)相关推荐
- [数据结构-严蔚敏版]P95矩阵压缩-特殊矩阵的存储(对称矩阵,三角矩阵)
对称矩阵的存储: 代码如下: #include <iostream> using namespace std;int main() {int n;cin >> n;int *a ...
- 三角矩阵上三角列优先压缩存储---加法、减法、乘法、转置、秩、行列式值、伴随矩阵、逆
三角矩阵上三角列优先压缩存储: 我们以图4.9中的矩阵A矩阵为例,针对A上三角部分,采用以列为主序存储至一个一维数组B内,按照三角矩阵上三角元素构成可知,该部分有n(n+1)/2个元素,因为下三角中的 ...
- 数据结构--三角矩阵的压缩存储
三角矩阵 三角矩阵的常用压缩方式有两种: 线性压缩 使用三角形的二维数组压缩 线性压缩存储三角矩阵 下三角矩阵: 上三角矩阵: 以下三角矩阵的线性压缩存储为例,进行实现: package pers.z ...
- 特殊矩阵的压缩存储(对称矩阵,三角矩阵,对角矩阵,稀疏矩阵的顺序,链序存储,十字链表的建立)
特殊矩阵的压缩存储 压缩存储的定义: 若多个数据元素的值都相同,则只分配一个元素值的存储空间,且 零元素不占存储空间. 能够压缩的一些矩阵: 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等 ...
- 上三角矩阵的乘法C语言,【数据结构】——基于压缩存储的半三角矩阵乘法运算的实现...
题目要求 已知两个n×n阶方阵A和B的上半三角(不含主对角线上元素)元素全为0,计算并输出这两个矩阵的乘积C=A×B.根据矩阵乘法性质可知,C矩阵的上半角三角元素(不含主对角线上元素)必然全为0. 要 ...
- 基于压缩存储的半三角矩阵乘法运算的实现
题目: 已知两个n阶下半三角矩阵的乘积仍为n阶下半三角矩阵.编程输入两个n阶下半三角矩阵,输出这两个矩阵的乘积.要求n阶下半三角矩阵采用一维数组压缩存储(即只存储下半三角). 程序先从键盘(或字符文件 ...
- 数据结构-拓展突破-特殊矩阵(对称矩阵,三角矩阵,三对角矩阵,稀疏矩阵)的压缩存储)
文章目录 1. 对称矩阵 2. 三角矩阵 3. 三对角矩阵 4. 稀疏矩阵 1. 对称矩阵 对称矩阵的定义: 若n阶方阵中任意一个元素a,都有a(i,j)=a(j,i)则该矩阵为对称矩阵 也就是说对称 ...
- 单链表(线性表的链式存储)---C语言版
目录 单链表(线性表的链式存储)---C语言版 一.相关说明 二.单链表的定义 三.单链表上具体操作的实现和时间复杂度 1.初始化表.构造一个空表. 2.根据数组创建单链表 3.求表长 4.插入操作. ...
- 一维数组二维数组对称矩阵三角矩阵三对角矩阵地址的计算
一维数组的地址计算 设每个元素的大小是size,首元素的地址是a[1],则 a[i] = a[1] + (i-1)*size 若首元素的地址是a[0] 则a[i] = a[0] + i*size 二维 ...
最新文章
- python 打包 .app 运行 控制台窗口_Python打包工具
- matlab 删除路径_MATLAB自动管理文件
- SOA:A note on RPC
- js调整数组某些元素到指定位置顺序_如何将一个 JavaScript 数组打乱顺序?
- Flutter学习记录(四、Flutter项目学习列表listView)
- anaconda3虚拟环境离线迁移到服务器
- 静态工厂方法与传统构造方法
- 解析JVM内存区域组成
- 【ABAP系列】SAP ABAP的事件执行顺序
- 聊聊索引失效的10种场景,巨坑
- 微信小程序调用百度云H5人脸识别
- Kali Linux2021安装搜狗输入法
- 操作系统--进程和线程
- 程序读取斗罗大陆热点词汇热度
- asa 防火墙拦截了https_Cisco ASA防火墙的URL过滤控制
- Netflix时代之后Spring Cloud微服务的未来
- CSS3-3D动画制作旋转立方体
- 在vscode上编写jsp_使用顶级 VSCode 扩展来加快开发 JavaScript
- telnet协议的Wireshark抓包分析
- 可截断素数(Truncatable primes)
热门文章
- MarchingCubes算法提取等值面的基本原理
- weui实例:城市便民自行车查询
- 离开,是为了新的开始
- CarSim仿真快速入门(三)
- 机器人基础之姿态矩阵
- SQL Server 2008 简体中文正式版下载地址(附序列号)
- 什么是IOC(控制反转)、DI(依赖注入)
- linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......
- 电脑公司 GHOST WIN10 X64 装机专业版 V2018.04(64位)
- Code Clinic: Clojure 代码诊所:Clojure Lynda课程中文字幕