国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

(14)稀疏矩陣的壓縮-三元組(相乘)

2019-11-08 20:25:57
字體:
來源:轉載
供稿:網友

(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");}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高尔夫| 廉江市| 连城县| 乾安县| 西华县| 绵阳市| 泉州市| 景德镇市| 通州区| 洞口县| 青海省| 陈巴尔虎旗| 大英县| 泗洪县| 张家港市| 焉耆| 绍兴县| 克什克腾旗| 岳阳县| 乡宁县| 七台河市| 平顶山市| 安塞县| 山西省| 会东县| 山阴县| 婺源县| 遂宁市| 华阴市| 乌拉特前旗| 平湖市| 门源| 彰化县| 南宫市| 新乡市| 宁城县| 汝城县| 九寨沟县| 灵川县| 淮北市| 涟源市|