矩阵的存储
来源:互联网 发布:博微电力工程造价软件 编辑:程序博客网 时间: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
- 矩阵的数据存储
- 矩阵的压缩存储
- 矩阵的压缩存储
- 矩阵的压缩存储
- 矩阵的压缩存储
- 矩阵的存储
- 矩阵的压缩存储
- 矩阵的压缩存储
- 矩阵的压缩存储
- 4.2矩阵的存储
- 矩阵的压缩存储
- 矩阵(稀疏矩阵)的压缩存储
- 对称矩阵、稀疏矩阵的压缩存储
- 特殊矩阵的压缩存储
- 稀疏矩阵的顺序存储
- 稀疏矩阵的存储格式
- 矩阵的存储优先顺序
- 带状矩阵的压缩存储
- SQL查询语句大全集锦
- 大话面向对象五大原则 SOLID
- APP被苹果APPStore拒绝的各种原因(收集)
- 【java细节】详解如何删除cookie
- 把indexPath.row 转为"A,B,C,D"
- 矩阵的存储
- 实体最小系统板
- QQ游戏百万人同时在线服务器架构实现
- HDU 3652
- The Cloud Security Ecosystem: Technical, Legal, Business and Management Issues
- 又见导弹拦截 nyoj 814
- 【已解决】Genymotion, “Unable to load VirtualBox engine”
- codeforces585D. Lizard Era: Beginning
- cf 18a Triangle