例如,二维数组Am按“行优先顺序”存储在内存中, 假设每个元素占用d个存储单元。 元素a的存储地址应是数组的基地址加上排在ai前 面的元素所占用的单元数。因为a位于第行、第j 列,前面-1行共有(1)×n个元素,第行上a前 面又有j-1个元素,故它前面一共有(-1)xn+j-1个 元素,因此,ai的地址计算函数为 LoC(a)=LOC(a1)+(-1)*n+-1]*d 同样,三维数组A按“行优先顺序”存储,其地址 计算函数为 Loc(aik)=Loc(a1)+[(1-1)n*p+(-1)*p+( 1)]*d
例如,二维数组Amn按“行优先顺序”存储在内存中, 假设每个元素占用d个存储单元。 元素aij的存储地址应是数组的基地址加上排在aij前 面的元素所占用的单元数。因为aij位于第i行、第j 列,前面i-1行一共有(i-1) ×n个元素,第i行上aij前 面又有j-1个元素,故它前面一共有(i-1) ×n+j-1个 元素,因此,aij的地址计算函数为: LOC(aij)=LOC(a11)+[(i-1)*n+j-1]*d 同样,三维数组Aijk按“行优先顺序”存储,其地址 计算函数为: LOC(aijk)=LOC(a111)+[(i-1)*n*p+(j-1)*p +(k- 1)]*d
上述讨论均是假设数组各维的下界是不是1, 更一般的二维数组是A[c1d1,C2.d],这里 C1,C2不一定是1。a前一共有i-c行,二维数 组一共有d2-C2+1列,故这i-C1行共有(i C1)(d2-C2+1)个元素,第行上a前一共有 C2个元素,因此,ai的地址计算函数为 LoC(a)=LOC(ac1c)+[(i-C1)*(d2-C2+1)+ C2)]*d 例如,在C语言中,数组各维下标的下界是0, 因此在C语言中,二维数组的地址计算公式 为 Loc(a)=LOC(a0)+(*(d2+1)+)*d
上述讨论均是假设数组各维的下界是不是1, 更一般的二维数组是A[c1..d1,c2..d2],这里 c1,c2不一定是1。aij前一共有i-c1行,二维数 组一共有d2-c2+1列,故这i-c1行共有(ic1)*(d2-c2+1)个元素,第i行上aij前一共有jc2个元素,因此,aij的地址计算函数为: LOC(aij)=LOC(ac1c2 )+[(i-c1)*(d2-c2+1)+jc2)]*d 例如,在C语言中,数组各维下标的下界是0, 因此在C语言中,二维数组的地址计算公式 为: LOC(aij)=LOC(a00)+(i*(d2+1)+j)*d
4.2矩阵的压缩存储 在科学与工程计算问题中,矩阵是一种常用的数 学对象,在高级语言编制程序时,简单而又自然 的方法,就是将一个矩阵描述为一个二维数组 矩阵在这种存储表示之下,可以对其元素进行随 机存取,各种矩阵运算也非常简单,并且存储的 密度为1。但是在矩阵中非零元素呈某种规律分 布或者矩阵中出现大量的零元素的情况下,看起 来存储密度仍为1,但实际上占用了许多单元去 存储重复的非零元素或零元素,这对高阶矩阵会 造成极大的浪费,为了节省存储空间,可以对这 类矩阵进行压缩存储:即为多个相同的非零元素 只分配一个存储空间;对零元素不分配空间
在科学与工程计算问题中,矩阵是一种常用的数 学对象,在高级语言编制程序时,简单而又自然 的方法,就是将一个矩阵描述为一个二维数组。 矩阵在这种存储表示之下,可以对其元素进行随 机存取,各种矩阵运算也非常简单,并且存储的 密度为1。但是在矩阵中非零元素呈某种规律分 布或者矩阵中出现大量的零元素的情况下,看起 来存储密度仍为1,但实际上占用了许多单元去 存储重复的非零元素或零元素,这对高阶矩阵会 造成极大的浪费,为了节省存储空间,可以对这 类矩阵进行压缩存储:即为多个相同的非零元素 只分配一个存储空间;对零元素不分配空间。 4.2 矩阵的压缩存储
特殊矩阵 所谓特殊矩阵是指非零元素或零元素的分布有 定规律的矩阵。 1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质 ai=ai0≤j≤n-1 则称A为对称矩阵。对称矩阵中的元素关于主对 角线对称,故只要存储矩阵中上三角或下三角中 的元素,让每两个对称的元素共享一个存储空间, 这样,能节约近一半的存储空间。不失一般性, 我们按“行优先顺序”存储主对角线(包括对角 线)以下的元素
所谓特殊矩阵是指非零元素或零元素的分布有一 定规律的矩阵。 1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij=aji 0≦i,j≦n-1 则称A为对称矩阵。对称矩阵中的元素关于主对 角线对称,故只要存储矩阵中上三角或下三角中 的元素,让每两个对称的元素共享一个存储空间, 这样,能节约近一半的存储空间。不失一般性, 我们按“行优先顺序”存储主对角线(包括对角 线)以下的元素。 1 特殊矩阵
存储形式如图所示: 5137 ac 00 50800 10a 18926 20 21 23 30251 70613 an10an11an-12…an1n1 在这个下三角矩阵中,第i行恰有i+1个元素,元 素总数为:(+1)=n(n+1)/2 可以将这些元素存放在一个向量sa0.n(n+1)/2-1] 中。为了便于访问对称矩阵A中的元素,我们必须 在a;和sak]之间找一个对应关系
存储形式如图所示: 1 5 1 3 7 a00 5 0 8 0 0 a10 a 11 1 8 9 2 6 a20 a21 a23 3 0 2 5 1 ……………….. 7 0 6 1 3 an-1 0 a n-1 1 a n-1 2 …a n-1 n-1 在这个下三角矩阵中,第i行恰有i+1个元素,元 素总数为:(i+1)=n(n+1)/2 可以将这些元素存放在一个向量sa[0..n(n+1)/2-1] 中。为了便于访问对称矩阵A中的元素,我们必须 在aij和sa[k]之间找一个对应关系