矩阵的存储

来源:互联网 发布:博微电力工程造价软件 编辑:程序博客网 时间:2024/05/22 11:36

对称矩阵:

当i>=j 时     a[i][j]的地址=a[0][0]的地址+((1+2+...i)*i+j)*L;

                  即 address(a[i][j])=address(a[0][0])+(1+i)×i/2+j;

当i<j 时     address(a[i][j])=address(a[0][0]+(1+j)*j/2+i;


#include<iostream>#include<cstdio>#include<cstdlib>using namespace std; int *memory(int n) {     int len =(1+n)*n/2;     int *base =(int *)malloc(len*sizeof(int));    for(int i=0;i<len;i++)        *(base+i)=i;     return base; } void Print(int *base,int n) {        int i,len;        len=(1+n)*n/2;        for(int i=0;i<n;i++)        {            for(int j =0;j<n;j++)            {                  if(i>=j)  printf( "%-3d",*(base+(1+i)*i/2+j));                  else  printf("%-3d", *(base+(1+j)*j/2+i));            }            cout<<endl;        }        cout<<endl; } void value(int *base,int i,int j,int *x,int n) {    if(i<0||i>=n||j<0||j>=n)    {        cout<<"error!"<<endl;        return ;    }    int id;    if(i>=j)    id=(1+i)*i/2+j;    else id=(1+j)*j/2+i;    *x=*(base+id); }int main(){    int *base=NULL;    int n,i,j,x;    printf("输入矩阵的维数n:");    cin>>n;    base=memory(n);    cin>>i>>j;    value(base,i,j,&x,n);    cout<<x<<endl;    Print(base,n);    return 0;}

下三角矩阵:

当i>=j时,address(a[i][j])=address(a[0][0])+(1+i)*i/2+j;

当i<j时,a[i][j]=0;

#include<iostream>#include<cstdio>#include<cstdlib>using namespace std; int *memory(int n) {     int len =(1+n)*n/2;     int *base =(int *)malloc(len*sizeof(int));    for(int i=0;i<len;i++)        *(base+i)=i;     return base; } void Print(int *base,int n) {        int i,len;        len=(1+n)*n/2;        for(int i=0;i<n;i++)        {            for(int j =0;j<n;j++)            {                  if(i>=j)  printf( "%-3d",*(base+(1+i)*i/2+j));                  else  printf("%-3d", 0);            }            cout<<endl;        }        cout<<endl; } void value(int *base,int i,int j,int *x,int n) {    if(i<0||i>=n||j<0||j>=n)    {        cout<<"error!"<<endl;        return ;    }    int id;    if(i>=j)    id=(1+i)*i/2+j ,*x=*(base+id);    else *x=0; }int main(){    int *base=NULL;    int n,i,j,x;    printf("输入矩阵的维数n:");    cin>>n;    base=memory(n);    cin>>i>>j;    value(base,i,j,&x,n);    cout<<x<<endl;    Print(base,n);    return 0;}

上三角矩阵

当i>j a[i][j]=0;

当i<=j时,address(a[i][j])=address(a[0][0])+(n+n-1+...+n-(i-1))+j-i=address(a[0][0])+n*i+(i+1)/2+j

#include<iostream>#include<cstdio>#include<cstdlib>using namespace std; int *memory(int n) {     int len =(1+n)*n/2;     int *base =(int *)malloc(len*sizeof(int));    for(int i=0;i<len;i++)        *(base+i)=i;     return base; } void Print(int *base,int n) {        int i,len;        len=(1+n)*n/2;        for(int i=0;i<n;i++)        {            for(int j =0;j<n;j++)            {                  if(i>j)  printf( "%-3d",0);                  else  printf("%-3d", n*i-(i+1)*i/2+j);            }            cout<<endl;        }        cout<<endl; } void value(int *base,int i,int j,int *x,int n) {    if(i<0||i>=n||j<0||j>=n)    {        cout<<"error!"<<endl;        return ;    }    int id;    if(i>j)   *x = 0;    else *x=*(base+n*i-(i+1)*i/2+j); }int main(){    int *base=NULL;    int n,i,j,x;    printf("输入矩阵的维数n:");    cin>>n;    base=memory(n);    cin>>i>>j;    value(base,i,j,&x,n);    cout<<x<<endl;    Print(base,n);    return 0;}


带状矩阵的压缩存储

带状矩阵主对角线两边各有b条对角线,由图可知,当下标|i-j|>b时,元素都为零,|i-j|<=b时,这块区域内有值

因为每一行的存的数不会超过2*b+1个,所以我们假设除了头和尾其他每一行都能存储2*b+1个,头和尾都只存储b+1个,即总数为(2*b+1)*n-2b个

由此退出地址公式:address(a[i][j])=address(a[0][0])+(i*(2*b+1)-b+j-i+b)=address(a[0][0])+(i*(2*b+1)+j-i);

当|i-j|>b时,值为0

#include<iostream>#include<cstdio>#include<cmath>#include<cstdlib>using namespace std;int *memory(int n,int b){    int len =(2*b+1)*n-2*b;    int *base = (int *)malloc(len*sizeof(int));    for(int i=0;i<len;i++)  *(base+i)=i;    return base;}void Print(int n,int b,int *base){    int cnt = 0;    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            if(abs(j-i)>b)  printf("%-5d",0);            else printf("%-5d",*(base+cnt++));        }        cout<<endl;    }}void value(int i,int j,int x,int n,int b,int *base) //更改矩阵某一点的值{    int id;    if(i<0||i>=n||j<0||j>=n)    {       cout<<"error"<<endl;       return ;    }    if(abs(i-j)<=b)  id =((2*b+1)*i+j-i),*(base+id)=x;    return;}int main(){    int n,b,*base,i,j,x;    while(cin>>n>>b)    {        base=memory(n,b);        printf("输入要更改点的下标:");        cin>>i>>j>>x;        value(i,j,x,n,b,base);        Print(n,b,base);    }    return 0;}


0 0