(1)因為position[i]表示B的第i行第一個非零元素在B.data中的序號,position[i+1]-1就表示第i行最后一個非零元素在B.data中的序號。為了表示B的最后一行最后一個非零元素在B.data中的序號,需在向量position中增加一個分量,即B的第m2行第一個元素的位置,雖然B中無第m2行。
(2)矩陣相乘的基本思想是:對A.data中的每一個元素A.data.e,找到滿足A.data[p].col=B.data[q].row的所有q,將A.data[p].e與B.data[q].e的乘積加到適當的求累積和的變量上。
(3)兩個稀疏相乘的結果不一定是稀疏矩陣,相乘的兩個分量A[i][k] x B[k][j]不為零,但累加的結果可能為零。
改進的三元組表的類型說明如下:
#define MAXSIZE 1000 //用戶自定義三元組最大個數#define MAXROW 100typedef int ElemType;typedef struct { //三元組 int row,col; //非零元素的行數和列數 ElemType e; //非零元素的值}Triple;typedef struct { Triple data[MAXSIZE]; //三元組表 int position[MAXROW]; //各行第一個非零元素的位置表 int m,n, len; //矩陣的行數、列數和非零個數}TSMatrix;完整代碼:#include<iostream>using namespace std;#define MAXSIZE 1000 //用戶自定義三元組最大個數#define MAXROW 100typedef int ElemType;int sum[10];typedef struct { //三元組 int row,col; //非零元素的行數和列數 ElemType e; //非零元素的值}Triple;typedef struct { Triple data[MAXSIZE]; //三元組表 int position[MAXROW]; //各行第一個非零元素的位置表 int m,n, len; //矩陣的行數、列數和非零個數}TSMatrix;//輸出矩陣void PRint(TSMatrix a){ int k; for (int i = 0; i < a.m;i++) { for (int j = 0; j < a.n;j++) { k = 0; for(int h=0;h<a.len;h++){ if (i == a.data[h].row && j==a.data[h].col) { cout <<" "<< a.data[h].e; k = 1; } } if (k == 0) { cout << " " << k; } } cout << endl; }}//采用改進的三元組表表示法,求矩陣乘積C=A*Bvoid MulMatrix(TSMatrix A,TSMatrix B,TSMatrix *C) { int p=0,crow,ccol,brow; if (A.n != B.m) { cout << "矩陣無法相乘!" << endl; } else { C->m = A.m; C->n = B.n; C->len = 0; while (p < A.len) { //處理A當前元素 crow = A.data[p].row; for ( ccol = 0; ccol < C->n; ccol++) sum[ccol] = 0; //當前行各元素清零 while (p<A.len && A.data[p].row==crow) { brow = A.data[p].col; //B的當前行等于A的當前元素的列號 for (int q = B.position[brow]; q < B.position[brow + 1];q++) { //處理B當前行 ccol = B.data[q].col; //乘積元素在C中的列號 sum[ccol] += A.data[p].e*B.data[q].e; } p++; } for (ccol = 0; ccol < C->n; ccol++) { //壓縮存儲該行非零元素到三元組表C.data中 if (sum[ccol]) { C->data[C->len].row = crow; C->data[C->len].col = ccol; C->data[C->len].e = sum[ccol]; C->len++; } } } }}void main() { TSMatrix A, B, C; A.m = 4; A.n = 4; A.len = 2; A.data[0].row = 1; A.data[0].col = 1; A.data[0].e = 2; A.position[1] = 0; A.data[1].row = 2; A.data[1].col = 3; A.data[1].e = 3; A.position[2] = 1; A.position[3] = 2; B.m = 4; B.n = 4; B.len = 3; B.data[0].row = 1; B.data[0].col = 1; B.data[0].e = 2; B.position[1] = 0; B.data[1].row = 2; B.data[1].col = 3; B.data[1].e = 3; B.position[2] = 1; B.data[2].row = 3; B.data[2].col = 2; B.data[2].e = 2; B.position[3] = 2; B.position[4] = 3; MulMatrix(B, B, &C); print(C); system("pause");}
新聞熱點
疑難解答