ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

矩阵的压缩储存(C++)

2021-07-19 13:03:13  阅读:210  来源: 互联网

标签:储存 ma int 矩阵 C++ ++ size row


主要思想:
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++版)(第二版)清华大学出版社 陈宝平等主编

标签:储存,ma,int,矩阵,C++,++,size,row
来源: https://blog.csdn.net/qq_58126670/article/details/118892062

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有