1 需求分析
稀疏矩陣是指哪些多元素為零的矩陣。利用「稀疏的特點」進行儲存和計算可以打打節省儲存空間,提高計算效率。實現乙個能進行稀疏矩陣基本運算的運算器。
以「帶行邏輯鏈結資訊」的三元組標表示稀疏矩陣,實現矩陣的轉置,實現兩個矩陣相加,相減和相乘的運算。稀疏矩陣的輸入形勢採用三元組表示,而運算結果的矩陣則以通常的陣列形勢列出。
演示程式以使用者和計算機的對話法師執行,陣列的建立方式為邊輸入邊建立。
由題目要求可知:首先應該輸入矩陣的行數和列數,並判別給出的兩個矩陣的行數,列數對於所要求作的運算是否相互匹配。
程式可以對三元組的輸入順序不加以限制;根據對矩陣的行列,三元組作直接插入排序,從而進行運算時,不會產生錯誤。
程式在vc6.0環境下設計。程式執行命令為:1.稀疏矩陣的轉置;2.稀疏矩陣的乘法;3.稀疏矩陣的加法;4.稀疏矩陣的減法;5.退出;的工作。
1.1 使用者角度
(1)從介面選擇一種演算法並輸入乙個或兩個稀疏矩陣,輸出運算的正確結果。
(2)介面簡潔,操作方便。
1.2 開發工具的特點
visual c++ 6.0版本:
(1)具有程式框架自動生成、靈活方便的類管理、**編寫和介面設計整合互動操作、可開發多種程式等優點。
(2)介面簡潔,占用資源少,操作方便。
(3)擁有「語法高亮」,自動編譯功能以及高階除錯功能而著稱。比如,它允許使用者進行遠端除錯,單步執行等。還有允許使用者在除錯期間重新編譯被修改的**,而不必重新啟動正在除錯的程式。其編譯及建立預編譯標頭檔案(stdafx.h)、最小重建功能及累加鏈結(link)著稱。這些特徵明顯縮短程式編輯、編譯及鏈結的時間花費,在大型軟體計畫上尤其顯著。
2 概要設計
圖2.1
1ï¼ 基本操作:
inputtsmatrix
操作結果:輸入三元組矩陣
outputsmatrix
初始條件:矩陣已經存在
操作結果:輸出矩陣
transmatrix()
初始條件:矩陣已經存在
操作結果:轉置輸入的矩陣
fasttranmat()
初始條件:矩陣已經存在
操作結果:快速轉置輸入的矩陣
multsmatrix()
初始條件:矩陣a和矩陣b已經存在
操作結果:求矩陣a和矩陣b的積
addmatrix()
初始條件:矩陣a和矩陣b已經存在
操作結果:求矩陣a和矩陣b的和
submatrix()
初始條件:矩陣a和矩陣b已經存在
操作結果:求矩陣a和矩陣b的減
模組調運關係如下:
3 詳細設計
3.1定義儲存矩陣三元組結構
#include
#include
const int maxsize = 100; //定義非零元素的最多個數
const int maxrow = 10; //定義陣列行數的最大值
const int sizenum = 10;
typedef struct //定義三元組元素
triple;
typedef struct //定義普通三元組物件
tsmatrix;
稀疏矩陣的三元組順序表:為了節省儲存空間,同樣對稀疏矩陣進行壓縮儲存,即只儲存稀疏矩陣的非零元素。但是為了實現矩陣的各種運算,還要必須同時記下他的行號和列號。這樣,乙個三元組(i,j,aij)便唯一的確定了矩陣中的非零元素,其中i,j分別表示非零元素的行號和列號,aij則表示非零元素的值。
3.2主要模組的詳細分析
3.2.1 矩陣的主程式模組
main函式主控呼叫其他模組並描述了以下介面:
3.2.1 矩陣的構造模組
void inputtsmatrix(tsmatrix *m)
}3.2.1 矩陣的運算模組
1)矩陣的轉置
void transmatrix()}}
}printf("運用普通轉置演算法, 輸入矩陣的轉置矩陣為:\n ");
outputsmatrix(t);
稀疏矩陣的轉置的實現規則:
1.將矩陣的行列值相互交換。2.每個三元組的i、j相互交換。3.重新排列三元組之間的次序便可實現轉置
2)矩陣的快速轉置
void fasttranmat()
for (t = 1; t <= m.nzeronums; t++)
//求第col列第乙個非零元在b.data中的序號
cpot[1] = 1;
for (col = 2; col <= m.cols; col++)
for (p = 1; p <= m.nzeronums; p++)
//end_for
}//end_if
printf("運用快速演算法,輸入矩陣的轉置為:\n ");
outputsmatrix(t);
}快速轉置的思想是開闢兩個陣列用來存放每一行有效值的個數,另乙個用來存轉置後順序表vector的起始位置。使得陣列可以快速找到有效順序在轉置後順序表裡的位置。也就是說快速轉置與普通轉置比較來說快速轉置更為有效計算機運算相對比較簡單。
4)矩陣的加法
//兩個稀疏矩陣的加法
int addmatrix()
if (a.rows == b.rows && a.cols == b.cols)
else if (a.data[i].c > b.data[j].c)
else
i++;
j++;}}
else if (a.data[i].r < b.data[j].r)
else
//把剩餘部分元素存入c中
if (i > a.nzeronums && j <= b.nzeronums)
}if (i <= a.nzeronums && j > b.nzeronums)}}
c.rows = a.rows;
c.cols = a.cols;
c.nzeronums = k-1;
printf("輸出兩個稀疏矩陣的和:\n ");
outputsmatrix(c);
return 1;
}else
return 0;
}稀疏矩陣的加法:稀疏矩陣的加法與普通矩陣的加法一樣,遵循普通矩陣的加法運算規則,也就是當矩陣a和矩陣b行數和列數必須相同才可以進行計算。
5)矩陣的減法
//兩個稀疏矩陣的減法
int submatrix()
m++;
n++;
}else if (a.data[m].c < b.data[n].c)
else
}else if (a.data[m].r < b.data[n].r)
else
}//end_while
if (m <= a.nzeronums)
}if (n <= b.nzeronums)
}c.nzeronums = k-1;
printf("兩個稀疏矩陣的差為:\n");
outputsmatrix(c);
return 1;
} //end_if
else
}//得到矩陣元素m[i][j]的值
int value(tsmatrix m, int i, int j)
}return 0;
}稀疏矩陣的減法:規則同加法一樣,矩陣a和矩陣b的行數和列數相等時才可以進行計算。
6)矩陣的乘法
//矩陣乘法的演算法
int multmat()
else
if (temp != 0)}}
c.rows = a.rows;
c.cols = b.cols;
c.nzeronums = p-1;
outputsmatrix(c);
return 1;}}
稀疏矩陣的乘法:同樣遵循普通矩陣的乘法運算,當矩陣a與矩陣b相乘時則只有前者的列數等於後者的行數時該運算才有意義。
(4)矩陣的輸出模組
//輸出矩陣,按標準格式輸出
void outputsmatrix(tsmatrix m)
else
printf("%4d",0);
}//end_j
printf("\n");
}//end_i
}main()
input()
transpose()
add()
sub()
mul()
output()
模組呼叫關係圖
â 3.3 主程式流程圖
4 測試
稀疏矩陣的定義:矩陣中非零元素遠遠小於矩陣元素的個數,並且非零元素的分布沒有一定的規律,則稱該矩陣為稀疏矩陣。
該程式測試所使用的矩陣a、b和矩陣c分別如下:
5 0 0 12 0 0 0 0 0 0 15 3 1 0 4 0 0
0 0 16 0 0 0 4 0 0 0 0 0 0 1 0 0 0
8 0 11 0 27 0 0 0 0 8 0 0 8 0 0 0 0
0 0 0 0 0 0 1 13 0 0 0 0 0 0 7 0 0
矩陣a 矩陣b 5 1 0 0 0
0â â â 0 0 0 3
矩陣c
稀疏矩陣轉置
輸出稀疏矩陣的轉置矩陣。行列均不大於20 第一行輸入兩個正整數n和m,分別表示矩陣的行數和列數,然後輸入矩陣三元組,最後輸入 0 0 0 表示結束輸入。轉置後的矩陣。include include define maxsize 100 typedef struct triple typedef st...
稀疏矩陣轉置矩陣
num 矩陣a中某列的非零元素的個數 cpot 初值表示矩陣a中某列第乙個非零元素在b中的位置,並有如下遞推 cpot 1 0 cpot col cpot col 1 num col 1 2 col nu end right.const int maxterm 100 struct sparsema...
稀疏矩陣的轉置
稀疏矩陣的轉置 使用了兩個輔助陣列 num num j 矩陣a中第j列非零元素的個數 cpot cpot j 矩陣a中第j列的第乙個非零元素在其轉置矩陣b的三元組順序表的位置。推出2個規則 1 cpot 1 1 2 cpot j cpot j 1 num j 1 演算法思路 根據1,2規則計算num...