2-9 设有一个n×n的对称矩阵A,如教材p69页a图所示。为了节约存储,可以只存对角线及对角线以上的元素,或者只存对角线或对角线以下的元素。前者称为上三角矩阵,后者称为下三角矩阵。我们把它们按行存放于一个一维数组B中,如图(b)和图(c)所示。并称之为对角矩阵A的压缩存储方式。试问:
(1)存放对称矩阵A上三角部分或下三角部分的一维数组B有多少元素?
(2)若在一维数组B中从0号位置开始存放,则如图a所示的对称矩阵中的任一元素a(ij)在只存上三角部分的情形下(图b)应存于一维数组的什么下标位置?给出计算公式。
(3)若在一维数组B中从0号位置开始存放,则a(ij)只存下三角时,对应在c数组中的下标计算公式?


(1) n是矩阵A对角线元素的个数 那么 B的元素个数就是 (n×n-n)/2+n=n(n+1)/2

(2) 矩阵元素a(ij)的编号是从1开始的,只存上三角的话,j肯定不小于i。
a(ij)前面有i-1行,第一行有n个元素,后依次是n-1,n-2,...,n-(i-2).然后第i行,a(ij)前有j-i个元素。所以
b数组的下标k=(n+n-(i-2))*(i-1)/2+j-i+0=(2n-i)*(i-1)/2+j-1
如果a(ij)不处于上三角位置时,只需将i与j对换即可。

(3) 思考方法同2
i>=j时 k=(1+(i-1))*(i-1)/2+j=i(i-1)/2+j
i < j时 k=j(j-1)/2+i



2-10 设A和B均为n*n的下三角矩阵,二维数组C,有n行n+1列。试设计一个方案,将A的下三角区域中的元素存放于C的下三角区域中,B先转置后存放于C的上三角区域中。给出计算A的矩阵元素a(ij)和B的矩阵元素b(ij)在C中的存放位置下标的公式。

对于A矩阵和B矩阵,只考虑i >= j的情形。
设在C中存放的位置为c[p][q] 因为是二维数组,所以均从0开始。同时为方便起见,矩阵A和B我们也假设是从0号还是计数。

那么对于a(ij)来说
p=i q=j;

对于b(ij)来说
首先是转置,那么i与j对换;b(ji)=b(ij)
然后这个上三角矩阵存入C中时,要右移一个位置,以保证不覆盖C的下三角区域。所以
p=j q=i+1;

2-11 三对角矩阵的定义:在该矩阵中除了主对角线及在主对角线上下最临近的两条对角线上的元素外,所有其他元素均为0.现在要将这样的三对角矩阵A中的非零元素按行存入一维数组B中,且a(11)存放在B[0]。给出a(ij)(1<=i<=n,i-1<=j<=i+1)在一维数组B中的存放位置的计算公式。

问题可以转化为a(ij)前有几个元素。
1) i=1时 j-i;
2) 1 < i < n时 (i-1)*3-1+j+1-i
3) i=n时 (i-1)*3-1+j+1-i
最后可以统一这三种情况
j+2i-3


2-12 设带状矩阵是n×n阶的方阵,其中所有的非零元素都在有主对角线及主对角线上下各b条对角线构成的带装区域内,其他元素都为零。试问:
(1)该带状矩阵中有多少个非零元素?
(2)设a11存放在B[0]中,试给出所有非零元素a(ij)在一维数组B中的存放位置。



1)只需求出下三角区域内有多少个零元素即可。(1+(n-1-b))*(n-1-b)/2=(n-b)(n-b-1)/2
这样的区域有2个 (n-b)(n-b-1)
非零元素个数为 n*n-(n-b)(n-b-1)=(2b+1)n-b(b-1)

2)同上题 必定有 1 <=i<=n i-b<=j<=i+b
感觉应该存在可以用通式把各种情况下的结果都写出来,但是找不到这样的通式,继续思考中。
答案给的好复杂。

Comments (0)