• 若一个n阶方阵A满足,其所有非零元素都集中在以对角线为中心的带状区域中,则称其为n阶对角矩阵
• b - 矩阵半带宽:主对角线上下方各有b条次对角线
• (2b+1)--矩阵的带宽
• 对于半带宽为 b(0<=b<(n-1))的对角矩阵,其|i-j|<=b的元素 ai,j不为零,其余元素为零.
•为了压缩存储空间,为0的空间,我们就不存储,或者判断出不是带状区域就输出 0
•找到对角矩阵坐标和一维数组的关系,进而对坐标进行换算,映射一维数组位序
•设计算法,保证逻辑结构不变,存储空间减小
• 利用一维数组,按顺序存储对角矩阵的元素
•在三对角矩阵中,除了第一行和最后一行各有两个元素,其余各行非零元素aij均有三个,所以共有(3n-2)个非零元素 ,(第一行和最后一行,节点个数为2两个)
• 处于对角线下方的节点,(a10,a21,a32,...),观察得出,有:j = i-1;
• 处于对角线上的节点,(a00,a11,a22,...),有 : j=i;
• 处于对角线上方的节点,(a01,a12,a23,...),有: j=i+1;
•方法一: 输入坐标的时候,可以判断,然后确定是哪个位置上的节点,从而得出对应的一维数组的位序
•方法二:① 观察
② 先确定节点,前i行的元素个数,为: 2+3*(i-1)=3i-1;
因为,第一行和最后一行有两个元素,所以先把第一行算上,然后再算剩余i-1行,即可.
③ 对角线下方的节点, aij是本行第一个非零元素,所以其前面的元素是k = 3i-1 = 2i+j
④ 对角线的节点,是本行的第二个非零元素, k = 3i = 2i+j
⑤ 对角线上方的节点,是本行的第三个非零元素, k = 3i+1 = 2i+j;
•我们一维数组是从0开始计算的,所以元素前面的节点个数,就是对应的坐标位序
- #include
- #include
- #define N 6
- //构建一维数组数组
- void Init(int *&b)
- {
- b = (int*)malloc(sizeof(int)*(3*N-1));
- }
- //将e赋值给对应的二维数组A[i][j]里面的值,存储在一维数组里面
- void Assign(int b[],int e,int i, int j)
- {
- if(j == i-1)
- {
- b[3*i-1] = e;
- }
- else if(j == i)
- {
- b[3*i] = e;
- }
- else if(j==i+1)
- {
- b[3*i+1] = e;
- }
- }
- //返回特定坐标里面的数值
- int Value(int b[],int i, int j)
- {
- if(j == i-1)
- {
- return b[3*i-1];
- }
- else if(j == i)
- {
- return b[3*i];
- }
- else if(j==i+1)
- {
- return b[3*i+1];
- }
- else
- {
- return b[3*N-2];
- }
- }
- //逐个输出二维数组里面的数据
- void Disp(int b[])
- {
- int i,j;
- for(i=0; i
- {
- for(j = 0; j
- {
- printf("%4d",Value(b,i,j));
- }
- printf("\n");
- }
- }
- //销毁存储空间
- void Destroy(int b[])
- {
- free(b);
- }
-
-
- int main()
- {
- //构建一维数组
- //一维数组在元素矩阵个数的基础上加一,存放两侧的数据
- int *b1;
- //坐标
- int i,j;
- //承载输入数据
- int v;
- //构建一位数组
- Init(b1);
- printf("请输入要压缩的带状数据两侧的数据是多少?\n");
- scanf("%d",&v);
- b1[3*N-2] = v;
- printf("请一次输入矩阵内的数据");
- for(i=0;i
- {
- printf("请输入第%d行的%d个元素\n",i+1,N);
- for(j = 0;j < N;j++)
- {
- scanf("%d",&v);
- Assign(b1,v,i,j);
- }
- }
- Disp(b1);
- Destroy(b1);
- return 0;
- }
运行结果如图:

-
相关阅读:
selenium之常用定位
曲线艺术编程 coding curves 第十三章 超级椭圆与超级方程(Superellipses and Superformulas)
暑假加餐|有钱人和你想的不一样(第四天)+多目标萤火虫优化算法(Matlab代码)
Python期末复习题:字符串与产生随机数
深入详解Mybatis的架构原理与6大核心流程
java-php-python--茶店订购管理系统-计算机毕业设计
Nginx反向代理联动Tomcat实现多实例部署、动静分离、负载均衡
【无标题】
Linux环境开发工具yum、makefile的使用 【Linux】
解决 Axios 跨域问题,轻松实现接口调用
-
原文地址:https://blog.csdn.net/qq_57484399/article/details/127725810