数组存储在一片相邻的存储单元里,以二维数组为例,当A[m][n]按“行优先顺序”存储时,其线性排列次序为:
a0,0,a0,1,…,a0,n-1,a1,0,a1,1,…,a1,n-1,…,am-1,0,am-1,1,…,am-1,n-1
元素ai,j的地址计算为(假设每个单元占k个地址单元):
LOC(ai,j) = LOC(a0,0)+(i*n+j)*k
按“列优先顺序”存储时,其线性排列次序为:
a0,0,a1,0,…,am-1,0,a0,1,a1,1,…,am-1,1,…,a0,n-1,a1,n-1,…,am-1,n-1
元素ai, j的地址计算为(假设每个单元占k个地址单元):
LOC(ai,j) = LOC(a0,0)+(j*m+i)*k
【例4-1】对于二维数组A[0..2][0..5],当按“行优先顺序”存储时,元素A[2][3]是第几个元素?当按“列优先顺序”存储时,元素A[2][4]是第几个元素?
解:这里m=3,n=6,当按“行优先顺序”存储时,元素A[2][3]的序号(i=2,j=3):
1+i*n+j=1+2*6+3=16
当按“列优先顺序”存储时,元素A[2][4]的序号(i=2,j=4):
1+j*m+i=1+4*3+2=15
下面以二维数组Am×n即矩阵来讨论多维数组的基本运算。
(1)转置矩阵运算算法。
转置是一种最简单的矩阵运算,对于一个m×n的矩阵Am×n,其转置矩阵是一个n×m的矩阵Bn×m,且B[i][j]=A[j][i](0≤i<m,0≤j<n)对应的算法如下:
void TransMat(MatType A,MatType B,int m,int n)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
B[j][i]=A[i][j];
}
(2)矩阵相加运算算法。
两个大小均为m×n的矩阵的元素相加后得到一个m×n的矩阵C,其运算是把A与B的相同位置的元素相加得到C,即C[i][j]=A[i][j]+B[i][j](0≤i<m,0≤j<n)对应的算法如下:
void AddMat(MatType A,MatType B,MatType C,int m,int n)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
C[i][j]=A[i][j]+B[i][j];
}
(3)矩阵相乘运算算法。
矩阵相乘是另一种常用的矩阵运算,其方法是我们所熟悉的,设C=A×B,其中A是m×n矩阵,B是n×k矩阵,则C为m×k矩阵,对应的算法如下:
void MutMat(MatType A,MatType B,MatType C,int m,int n,int k)
{
int i,j,l;
for(i=0;i<m;i++)
for (j=0;j<k;j++)
{
C[i][j]=0;
for(l=0;l<n;l++)
C[i][j]=C[i][j]+A[i][l]*B[l][j];
}
}
(4)输出矩阵运算算法。
以行列方式显示矩阵的所有元素。
void DispMat(MatType A)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<A[i][j];
cout << endl;
}
}