矩阵的压缩储存(C++)
2021/7/19 14:06:07
本文主要是介绍矩阵的压缩储存(C++),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
主要思想:
1.利用数学公式进行下标转换,把原本高维的数组下标转换成一维
本题以对称矩阵为例
下标转换公式如下:
来源是:(上一行的所有元素总和(本题中即为等差数列求和))+(这一行前面的所有元素)
注意
1.这里都是以0开头,数组中的 [0] 也要储存元素,所以公式中会出现结果为0
2.本题思想和下三角矩阵的一样,只不过是下三角矩阵要多开一个数组空间储存它上三角的值( 下三角矩阵中,上三角的值都相等),同时要更改一下 i < j 的情况。上三角矩阵就是反过来的等差数列求和.
3.对角矩阵,带状矩阵同理,也是找数学公式,
百度百科链接: 带状矩阵.
我采用的方法是用二维数组输入,如果想直接用一维数组接受输入也可以,注意下标就好了
#include<bits/stdc++.h> using namespace std; class symmetric_matrix { int* ma; int size; int row_num; public: symmetric_matrix() { size = 0; ma = new int[size]; row_num = 0;//初始化 } symmetric_matrix(int** a, int row) { int i, j; size = row * (row + 1) / 2; row_num = row; ma = new int[size]; for (i = 0; i < row; i++) { for (j = 0; j < row; j++) { if (i >= j) ma[(i * (i + 1)) / 2 + j] = a[i][j]; else { ma[(j * (j + 1)) / 2 + i] = a[i][j]; } } } } void print() { int i, j; for (i = 0; i < row_num; i++) { for (j = 0; j < row_num; j++) { if (i >= j) cout << ma[(i * (i + 1)) / 2 + j] << " "; else { cout << ma[(j * (j + 1)) / 2 + i] << " "; } if (j == row_num - 1) cout << endl; } } } symmetric_matrix addmatrix(symmetric_matrix a) { symmetric_matrix b; b.size = size; b.row_num = row_num; delete b.ma;//释放无参构造函数开辟的空间 b.ma = new int[size];//重新声明一个变量来储存相加后的矩阵 int i, j; for (i = 0; i < size; i++) { b.ma[i] = a.ma[i] + ma[i]; } return b; } symmetric_matrix submatrix(symmetric_matrix a) { symmetric_matrix b; b.size = size; b.row_num = row_num; delete b.ma; b.ma = new int[size]; int i, j; for (i = 0; i < size; i++) { b.ma[i] = a.ma[i] - ma[i]; } return b; } //由于对称矩阵相乘不一定得到对称矩阵,所以不用考虑相乘 }; int main() { int** a, b; cin >> b; int i, j; a = new int* [b]; for (i = 0; i < b; i++) { a[i] = new int[b]; } for (i = 0; i < b; i++) { for (j = 0; j < b; j++) { cin >> a[i][j]; } } symmetric_matrix p(a,b); p.print(); cin >> b; a = new int* [b]; for (i = 0; i < b; i++) { a[i] = new int[b]; } for (i = 0; i < b; i++) { for (j = 0; j < b; j++) { cin >> a[i][j]; } } symmetric_matrix p1(a, b); (p.addmatrix(p1)).print(); (p.submatrix(p1)).print(); } /*1 2 3 2 5 4 3 4 6*/
参考:数据结构(c++版)(第二版)清华大学出版社 陈宝平等主编
这篇关于矩阵的压缩储存(C++)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-28pyqt 怎么打包整个项目-icode9专业技术文章分享
- 2024-09-28laravel Commands 创建带有参数的 Artisan 命令的步骤和示例-icode9专业技术文章分享
- 2024-09-28antd怎么实现渲染tiff图片-icode9专业技术文章分享
- 2024-09-28英文半角中划线和中文全角的中划线有什么区别-icode9专业技术文章分享
- 2024-09-28nvm npm 和node 他们之间有什么关系-icode9专业技术文章分享
- 2024-09-28Node Version Manager (nvm)使用教程-icode9专业技术文章分享
- 2024-09-28nvm命令太慢,是什么原因-icode9专业技术文章分享
- 2024-09-28Kotlin 如何增加、删除和修改 MutableStateFlow 中的值。-icode9专业技术文章分享
- 2024-09-28Kotlin的stateFlow.update 写法介绍-icode9专业技术文章分享
- 2024-09-28kotlin 怎么获取当前时间格式-icode9专业技术文章分享