对称矩阵存储
对对称阵进行压缩存取是将对称元素只存一个,并将数据存储在一维数组中
首先来确定a[i][j]在b[k]中的i,j与k的关系
首先是判定i与j的关系,
如果是下三角存储,则分一下两种情况
1、如果i<j,
则交换i与j的值,将上三角的位置值变换到下三角位置
2、如果i>=j,则不用执行操作直接走下面的流程
此时,i表示行坐标,j表示了坐标i之前有i行,即有1+2+...+i
=
(i+1)*i/2,在i标识的第i+1行有j+1个元素,由此可以确定k的值为(i+1)*i/2+j+1
=
k+1
由此可得k
=
(i+1)*i/2+j
由此可以的,a[3][6],
i=3,
j=6,
由于i<j,
交换得i=6,
j=3
由此
k
=
(6+1)*6/2+3
=
24
又由于&b[0]
=
1000
每个元素占两个字节,
则b[24]
=
1000+2*24
=
1048
由此便得到a[3][6]的地址为1048
Ⅱ 设有10阶对称矩阵a,采用压缩存储方式(以行序为主序存储,则a11的地址为1),则a85的地址为。
首先,压缩存储对于对称矩阵来说,等于是存对角线的右上半加对角线的元素,或者是左下半加对角线的元素,其他位置不存储。
这题是使用行优先存储,即先存a11,再a12,再a22,再a13,再a23,再a33,以此类推,一直到a85,所以a85的位置计算为:(1+2+3+4+5+6+7)+5=33,选择答案B。
对称矩阵(Symmetric Matrices)是指元素以主对角线为对称轴对应相等的矩阵。在线性代数中,对称矩阵是一个方形矩阵,其转置矩阵和自身相等。
(2)对称矩阵存储扩展阅读
LAPACK是由美国国家科学基金等资助开发的着名公开软件。LAPACK包含了求解科学与工程计算中最常见的数值线性代数问题,如求解线性方程组、线性最小二乘问题、特征值问题和奇异值问题等。
LAPACK提供了丰富的工具函式,可用于诸如解多元线性方程式、线性系统方程组的最小平方解、计算特征向量、用于计算矩阵QR分解的Householder转换、以及奇异值分解等问题。 在NetLib亦提供了API经简化的Fortran 95版本的LAPACK95。LAPACK以BSD授权的方法释出。
Ⅲ 为什么对称矩阵可将n²个元素压缩存储到n(n+1)/2个元素的一维数组。而非存到n²/2一维数组
n×n阶对称矩阵中,对称轴上的元素是没有映像的,它们不重复。
对称轴一侧有n(n-1)/2个元素,对称轴上有n个元素,这是能够压缩的最低限数量,它们的和为:
n(n-1)/2+n=(n²-n+2n)/2=(n²+n)/2
=n(n+1)/2个。
而不是总用元素个数n²/2。
Ⅳ 设对称矩阵A压缩存储在一维数组B中
首先由 a52能够得到的信息有:
针对特殊的矩阵压缩的方式是存储下三角,而且下三角计算一维数组的下标是:k=i(i+1)/2+j
由a11 存储在B[0]可以知道 从1开始存储,计算时需要减1
a36位于上三角中,对应的下三角的点是a63,在根据公式就能算出下标,注意一定要找到下三角的点
Ⅳ 数据结构中对称矩阵的压缩存储的一 一对应关系怎么算的
先看上面一个:
下三角有i>=j
第1行一个,第2行两个,。。。,第i-1行i-1个(i, j下标都是从1开始的)
所以第i行前有1+2+...+(i-1)= i(i-1)/2个元素
再看本行,本元素前有j-1个元素
因为计算的是元素之间的位置差,因此就是i(i-1)/2+(j-1)了
下面一个上三角i<j:
对于对称矩阵有a(i,j)=a(j,i),即行列互换,代入上式即可得
Ⅵ n阶对称矩阵采用压缩存储,需存储的数据元素个数是
只要存对角线(含)以上的部分就行了,所以是1+2+...+n=n(n+1)/2
Ⅶ 将10阶对称矩阵压缩存储到一维数组
C
((100-10)/2)+10
Ⅷ 一个8×8的对称矩阵,采用压缩存储需要几个对应的空间
一个8×8的对称矩阵,采用压缩存储需要
1+2+3+...+7+8=36
个对应的空间。
Ⅸ 对称矩阵的压缩存储
#include<iostream>
using namespace std;
int main()
{
int temp[1000];
int t[500][500];
int arry1[1000],arry2[1000];
int n;
scanf("%d",&n);
int i;
int m;
m=n*n+n;
m=m/2;
for(i=1;i<=m;i++)
{
scanf("%d",&arry1[i]);
}
for(i=1;i<=m;i++)
{
scanf("%d",&arry2[i]);
}
for(i=1;i<=m;i++)
{
temp[i]=arry1[i]+arry2[i];
}
int j;
int k;
for(i=1,k=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{ t[i][j]=temp[k];
k++;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j>i)
printf("%d",t[j][i]);
else
printf("%d",t[i][j]);
if(j!=n)
printf(" ");
}
printf("\n");
}
return 0;
}
Ⅹ 请问一下数据结构中对称矩阵的压缩存储的一 一对应关系怎么算的呀。
其实书本上说的已经够了,我就不再赘述了,下面说说不明白的地方吧!
书本上说了 1<=i,j<=n,所以矩阵下标ij是以1开始的,但书本上的k是从0开始的
则下三角区和主对角线下标ij和一维向量下标k的关系式为i(i-1)/2+j-1,如果k从1开始,则关系式为i(i-1)/2+j。
好,进入正题思路:
第1行一个,第2行两个,。。。,第i-1行i-1个;第i行元素位置在第j,也就是说,第i行截止到它有j个。
所以要分开思考,1到i-1行的元素之和+本行截止到它的元素之和=它在一维数组的位置。
第i行前面i-1行的总和为i(i-1)/2,本行第i行截止到所求元素总数为j,所以加起来为i(i-1)/2+j。然后-1,代表k从0开始。
比如想取第3行第2列矩阵元素隐射到一维数组的位置
本行第3行之前2行的元素总数为3*2/2=3 对应 [i(i-1)/2]
然后j是在本行的位置是2 对应[+j]
总的等于5
这个第3行第2列的元素应该在一维数组的第五个位置,但是一维是从零开始的,所以5-1,得到对应一维数组的下标为4.
王道书上和楼上的答案都是正确的,只不过思路和我的有点不同,我的是处的位置,他们是要求元素之前位置,区别也就+-1