数组和稀疏矩阵

Posted wfszmg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组和稀疏矩阵相关的知识,希望对你有一定的参考价值。

数组

数组的基本概念
从逻辑结构上看,一维数组A是n(n>1)个相同类型数据 元素a1、a2、…、an构成的有限序列,其逻辑表示为:A=(a1,a2,…,an)其中,ai(1≤i≤n)表示数组A的第i个元素。

数组的存储结构

将数组的所有元素存储在一块地址连续的内存单元中,这是一种顺序存储结构;
几乎所有的计算机语言都支持数组类型,以C/C++语言为例, 其中数组数据类型具有以下性质
1. 数组中的元素数目固定
2. 数组中的所有数组元素具有相同的数据类型
3. 数组中的每个元素都有一组唯一的下标
4. 数组是一种随机存储结构,可随机存取数组中的任意数据元素
LOC(ai)=LOC(a1)+(i-1)*k (0≤i≤n)

对于一个m行n列的二维数组A(m×n) 存储方式有
  • 以行序为主序的存储
    技术图片
    技术图片
  • 以列序为主序的存储
    技术图片

特殊矩阵的压缩存储

特殊矩阵主要形式有

  • 对称矩阵
  • 上三角矩阵/下三角矩阵
  • 对角矩阵
    但是它们都是方阵,即行数和列数相等

1.对称矩阵的压缩存储

??????若一个n阶方阵A[n][n]中的元素满ai,j=aj,i(0≤i,j≤n-1),则称其为n阶对称矩阵
技术图片
技术图片
技术图片
技术图片

2.三角矩阵的压缩存储

技术图片
技术图片

3.对角矩阵的压缩存储

技术图片
技术图片

稀疏矩阵

  一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t十分小时,即s<<t,该矩阵成为稀疏矩阵

1. 稀疏矩阵的三元组表示方法

稀疏矩阵中的每一个非零元素需由一个三元组:(i ,j ,ai,j)唯一确定,稀疏矩阵中的所有非零元素构成三元组线性表。

技术图片

技术图片
技术图片
技术图片
技术图片
技术图片

#include "stdio.h"
#include <corecrt_malloc.h>
#define MaxSize 100 //矩阵中非零元素的最大个数
constexpr auto M = 6;
constexpr auto N = 7;

//存放一个非零元素
typedef struct TupNode {
	int r;	//行号
	int c;	//列号
	int d;	//元素值
}TupNode, * pTupNode; //三元组定义(1,2,a12)  (2,3,a23)

//存放整个稀疏矩阵
typedef struct TSMatrix {
	int rows;	//行数值
	int cols;	//列数值
	int nums;	//非零元素个数
	TupNode data[MaxSize]; //三元组
}TSMatrix, * pTSMatrix;		//三元组顺序表定义

//先创建三元组
void Create(pTSMatrix t, int arr[M][N]) {
	int i, j;
	t->rows = M;
	t->cols = N;
	t->nums = 0;
	for (i = 0; i < t->rows; i++) {
		for (j = 0; j < t->cols; j++) {
			if (arr[i][j] != 0) {
				t->data[t->nums].r = i;
				t->data[t->nums].c = j;
				t->data[t->nums].d = arr[i][j];
				t->nums++;
			}
		}
	}
}
//输出三元组
void Disp(pTSMatrix t) {
	if (t->nums <= 0)
		return;
	for (int i = 0; i < t->nums; i++)
		printf("	%d	%d	%d
", t->data[i].r, t->data[i].c, t->data[i].d);
}
void main() {
	pTSMatrix t;
	t = (pTSMatrix)malloc(sizeof(TSMatrix));
	int arr[M][N] = {
		{0,0,1,0,0,0,0},
		{0,2,0,0,0,0,0},
		{3,0,0,0,0,0,0},
		{0,0,0,5,0,0,0},
		{0,0,0,0,6,0,0},
		{0,0,0,0,0,7,4}
	};
	Create(t, arr);
	Disp(t);
}

输出结果为:
技术图片

未完待续----























以上是关于数组和稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

scipy稀疏矩阵和numpy数组之间的点积给出ValueError

多维数组-矩阵的压缩存储- 稀疏矩阵(一)

JAVA描述算法和结构(01):稀疏数组和二维数组转换

用于 numpy 数组和 scipy 稀疏矩阵的 Tensordot

Java数据结构—稀疏数组

稀疏数组