关于矩阵的几种存储方式 Hayden'Blog

来源:互联网 发布:html网页源码下载 编辑:程序博客网 时间:2024/06/11 17:36

1.矩阵

关于矩阵我们就不解释定义了,这里只说一下矩阵一旦被定义之后,矩阵的行数和列数就不能被改变。

对于一般线性结构的矩阵,我们采用顺序存储结构,以二维数组来存储。

以二维数组存储分为两种主要形式:

  • 以行为序存储
  • 以列为序存储


这样对于一个矩阵,一旦确定了行数和列数,便可以为其分配存储空间,反之,如果给定了矩阵中的第一个元素的存放地址(basic address),我们就可以将矩阵中元素的存储地址表示为其下标的线性函数,这样就可以随机读取或查找矩阵中的任意一个元素。

比如:Loc(a ij)  = Loc(a 11) + [(i-1)*n+(j-1)]*d 我们假设每个元素占用d个单元,aij就是前面所有元素占用的单元数加上基地址。


2.一些特殊的矩阵存储

我们知道如果用一个矩阵中可能会有情况是我们用不上二维数组里面所有的空间,也就是说一个矩阵中我们可能会用到的元素和他占用的空间相差是很大的,这就意味着会造成空间的浪费,因为我们是要为每一个元素开辟存储空间的,比如对于下面的一些特殊矩阵,我们就可以使用特殊的存储方法来存储他们

  • 对称矩阵
    • 对称矩阵就是说一个矩阵中,元素满足a ij = a ji (0<=i,j<=n-1) 
对于对称矩阵,我们就没有必要为每一个元素开辟存储空间了,因为他们有一部分的想同的

我们可以以行为序来存储对称矩阵

我们让第一行放一个元素,第二行放两个元素,第三行放三个元素,以此类推......就是说我们会真正存储的元素个数是 1 + 2 + 3 + …… + n = n*(n+1)/2 等差数列就不多说了

这样我们定义一个SA[n*(n+1)/2] 的数组来存储元素,现在我们要访问 a ij元素 !!!敲黑板了

  • 若 i >= j 说明元素在对称矩阵的下三角部分
                         此时数组中 代表的a ij 的元素之前就 i 行 ,有 1 + 2 + 3 + ...... i = i(i+1)/2 个元素,因此 k(a ij的下标) = i(i+1)/2 + j  

  • 若 i < j  说明元素在对称矩阵的上三角部分
                         因为a ij = a ji ,所以同理以上 ,将i和j互换即可 得到: k = j(j+1)/2 + i;

这样一来:

k = i*(i+1)+j i>=j

k = j*(j+1)+i i<j


以上就是对称矩阵的存储方式,等下有时间再更新压缩存储的,要去上课了 orz .... 


         



原创粉丝点击