数据结构——数组—稀疏矩阵及运算

来源:互联网 发布:成都电脑编程培训 编辑:程序博客网 时间:2024/05/18 12:36

对于稀疏矩阵,我们可以用三元组顺序表来储存它。

当需要将矩阵转置时,需要添加一个数组,记录每行的非零元素在转置后的三元组表中的位置,这样就可以按照原三元组表中的顺序将非零元素吗,依次放入转置后三元组表中相应的位置,然后交换行列即可;

当计算两个稀疏矩阵相乘时,需要建立记录每列非零元素在三元组表中位置的数组,对于被乘矩阵a的每一行的每个元素,在乘矩阵b中找到与a元素列数相同的行,该行每个元素与之相乘然后相加,当a的一行遍历完之后,保存至以a的行数为行,b的列数为列的数组中去,以此类推。

/*用三元组表表示稀疏矩阵*/#include<iostream>using namespace std;class triple{public :int i, j;//i:行,j:列int v;};class TSMatrix{public:triple data[101];int cpot[101] = { 0 } ;//每列第一个元素在转置后三元表中的位置int rpot[101] = { 0 };//每行第一个元素在当前三元表中的位置int cnum[101] = {0};//每列的非零元素的个数int rnum[101] = { 0 };//每行的非零元素的个数int mu, nu, tu=0;//数组的行,列,非零元素个数、void iniMatrix()//数组初始化{cout << "请输入数组行数:";cin >> mu;cout << "请输入数组列数:";cin >> nu;cout << "请输入非零元素个数:";cin >> tu;for (int n = 1; n <= tu; n++){cout << "请输入第" << n << "个元素的所在行:";cin >> data[n].i;cout << "请输入第" << n << "个元素的所在列:";cin >> data[n].j;cout << "请输入第" << n << "个元素的值:";cin >> data[n].v;cnum[data[n].j]++;rnum[data[n].i]++;}cpot[1] = 1;for (int n = 2; n <= nu; n++){cpot[n] = cpot[n - 1] + cnum[n - 1];}rpot[1] = 1;for (int n = 2; n <= mu; n++){rpot[n] = rpot[n - 1] + rnum[n - 1];}}void printMatrix()//打印数组{int index = 1;for (int m = 1; m <= mu; m++){for (int n = 1; n <= nu; n++){if (m == data[index].i&&n == data[index].j)cout << data[index++].v << " ";elsecout << "0 ";}cout << endl;}}TSMatrix fastTransposeSMatrix()//快速转置{TSMatrix Tmatrix;Tmatrix.mu =nu;Tmatrix.nu = mu;Tmatrix.tu = tu;for (int n = 1; n <= tu; n++){int col,q;col = data[n].j;//元素的列数q = cpot[col];//在转置后三元表的位置Tmatrix.data[q].i = data[n].j;Tmatrix.data[q].j = data[n].i;Tmatrix.data[q].v = data[n].v;cpot[col] ++;}return Tmatrix;}};int multSMatrix(TSMatrix a, TSMatrix b, TSMatrix &q){if (a.nu != b.mu){cout << "数组规格不符合" << endl;return 0;}q.mu = a.mu;q.nu = b.nu;q.tu = 0;if (a.tu*b.tu != 0){for (int arow = 1; arow <= a.mu; arow++)//对于a的每一行{int tp,brow,t,qq, ccol;int ctemp[100] = {0};q.rpot[arow] = q.tu + 1;//q中每一行第一个非零元素是第几个非零元素if (arow < a.mu)tp = a.rpot[arow + 1];//tp:a中下一行第一个非零元的位置elsetp = a.tu + 1;for (int p = a.rpot[arow]; p < tp; p++)//p:对于当前行的的每一个非零元{brow = a.data[p].j;//找到b中相乘的对应元的行号即a中元素的列号if (brow < b.mu)t = b.rpot[brow + 1];//t:b中对应元素下一行的第一个非零元的位置elset = b.tu + 1;for(qq=b.rpot[brow];qq<t;qq++)//qq:b中对应元素所在行的每一个元素{if (qq == 0) break;ccol = b.data[qq].j;ctemp[ccol] += a.data[p].v*b.data[qq].v;}}for (ccol = 1; ccol <= b.nu; ccol++){if (ctemp[ccol]){if (++q.tu > 100)return -1;q.data[q.tu].i = arow;q.data[q.tu].j = ccol;q.data[q.tu].v = ctemp[ccol];}}}}return 1; }int main(){TSMatrix matrix,Tmatrix;matrix.iniMatrix();matrix.printMatrix();Tmatrix = matrix.fastTransposeSMatrix();cout << "转置后" << endl;Tmatrix.printMatrix();TSMatrix matrixOne, matrixTwo, matrixThr;matrixOne.iniMatrix();matrixOne.printMatrix();matrixTwo.iniMatrix();matrixTwo.printMatrix();if(multSMatrix(matrixOne, matrixTwo, matrixThr)!=-1)matrixThr.printMatrix();return 0;}


阅读全文
0 0
原创粉丝点击