張智星 (Roger Jang) 清大資工系 多媒體檢索實驗室

Slides:



Advertisements
Similar presentations
MATLAB 程式設計入門篇 矩陣的處理與運算 張智星 (Roger Jang) 台大資工系 多媒體檢索實驗室.
Advertisements

第一單元 建立java 程式.
張智星 清大資工系 多媒體檢索實驗室 MATLAB 程式設計進階篇 程式計時 張智星 清大資工系.
MATLAB 程式設計 時間量測 清大資工系 多媒體資訊檢索實驗室.
中二數學 第五章 : 二元一次方程 二元一次方程的圖像.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
Project 2 JMVC code tracing
主題五 CPU Learning Lab.
資料結構 第2章 陣列.
Chap5 Graph.
Chapter 2 陣列結構 資料結構導論 - C語言實作.
簡易C++除錯技巧 長庚大學機械系
Chapter 4 Spanning Trees
2-3 基本數位邏輯處理※.
使用VHDL設計—4位元位移器 通訊一甲 B 楊穎穆.
C語言簡介 日期 : 2018/12/2.
(Circular Linked Lists)
張智星 清大資工系 多媒體檢索實驗室 第九章: 矩陣的處理與運算 張智星 清大資工系 多媒體檢索實驗室.
雲端運算的基石(2) 虛擬化技術實作(XP篇─上)
Java 程式設計 講師:FrankLin.
張智星 (Roger Jang) 台大資工系 多媒體檢索實驗室
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
第一章 直角坐標系 1-1 數系的發展.
第九章: 矩陣的處理與運算 張智星 (Roger Jang)
MATLAB陣列之輸入與處理 資管碩一 蘇柏屹.
MATLAB 程式設計入門篇 初探MATLAB
第一單元 建立java 程式.
建立一 function s (type) 可以用來繪製cyclic-harmonic curves
陣列(Array).
第三章 資料型態與輸出控制 本章學習目標 認識Matlab的基本資料型態 練習資料型態的轉換 學習如何控制Matlab的輸出格式
第一章 直角坐標系 1-3 函數圖形.
張智星 清大資工系 多媒體檢索實驗室 MATLAB 程式設計進階篇 線性代數 張智星 清大資工系.
張智星 (Roger Jang) 清大資工系 多媒體檢索實驗室
Definition of Trace Function
張智星 (Roger Jang) 台大資工系 多媒體檢索實驗室
使用VHDL設計 七段顯示器 通訊工程系 一年甲班 姓名 : 蘇建宇 學號 : B
張智星 清大資工系 多媒體檢索實驗室 Tree Net Construction 張智星 清大資工系.
第 2 章 陣列(Array)與矩陣(Matrix)的運算
張智星 清大資工系 多媒體檢索實驗室 MATLAB 程式設計 第11章 多維陣列 張智星 清大資工系.
工程數學 Chapter 10 Fourier Series , Integrals , and Transforms 楊學成 老師.
撰寫MATLAB基礎財務程式 柯婷瑱.
挑戰C++程式語言 ──第8章 進一步談字元與字串
The Flow of PMOS’s Mobility (Part2)
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
C qsort.
MicroSim pspice.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
MiRanda Java Interface v1.0的使用方法
反矩陣與行列式 東海大學物理系‧數值分析.
函數應用(二)與自定函數.
陣列與結構.
第九章 布林代數與邏輯設計.
第 三 章 陣 列 課程名稱:資料結構 授課老師:________ 2019/5/15.
6.1 動畫檔案的格式 6.2 建立合適的動畫元素.
3.1 矩陣的行列式 3.2 使用基本運算求行列式 3.3 行列式的性質 3.4 特徵值介紹 3.5 行列式的應用
資料表示方法 資料儲存單位.
MultiThread Introduction
第一章 直角坐標系 1-3 函數及其圖形.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
補充 數值方法 數值方法.
第四組 停車場搜尋系統 第四組 溫允中 陳欣暉 蕭積遠 李雅俐.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Array(陣列) Anny
10303: How Many Trees? ★★☆☆☆ 題組:Contest Archive with Online Judge
Chapter 4 Multi-Threads (多執行緒).
快取映射 之直接對映 計算整理.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

張智星 (Roger Jang) jang@mirlab.org http://mirlab.org/jang 清大資工系 多媒體檢索實驗室 MATLAB 程式設計進階篇 稀疏矩陣 張智星 (Roger Jang) jang@mirlab.org http://mirlab.org/jang 清大資工系 多媒體檢索實驗室

5-1 稀疏矩陣的建立 根據元素的值,MATLAB 的矩陣可分為兩種 : 完全矩陣(Full Matrix) 5-1 稀疏矩陣的建立 根據元素的值,MATLAB 的矩陣可分為兩種 : 完全矩陣(Full Matrix) 每一個元素都存成 double 的資料型態,佔用 8 個 Byte 一個 m×n 的完全矩陣,所佔用的記憶體空間是 8×m×n 個 Byte 稀疏矩陣(Sparse Matrix) 大部分的元素都是 0 只須儲存「非零元素的位置」及其「元素值」 優點 節省記憶體儲存空間 節省某一些不必要的運算

稀疏矩陣範例-1(I) sparse 指令可將一個完全矩陣轉換成稀疏矩陣 範例5-1:sparse01.m (1,1) 2 (3,2) 4 (2,4) 1 可看出,S 是一個稀疏矩陣,MATLAB 只儲存其各個非零元素的位置(即其二維下標 (1,1)、(3,2)、(2,4))和元素值(2、4、1) clear all; % 清除所有的變數 A = [2 0 0 0; 0 0 0 1; 0 4 0 0]; % 完全矩陣 S = sparse(A) % 將完全矩陣 A 轉換成稀疏矩陣 S

稀疏矩陣範例-1(II) 比較矩陣 A 和 S 所佔用的記憶體大小 : >> whos Name Size Bytes Class Attributes A 3x4 96 double S 3x4 88 double sparse 看出稀疏矩陣 S 佔用記憶體的位元組數目(88 Bytes)比 矩陣A(佔用 96 Bytes)還要小。

稀疏矩陣範例-2(I) S = sparse(i, j, s, m, n); 使用 sparse 指令來直接產生稀疏矩陣 i 是列索引 m 是 s 的列維度 n 是 s 的行維度 i、j、s 都是長度相同的向量 s(k) 的二維下標即是 i(k)及 j(k)

稀疏矩陣範例-2(II) >> S = sparse([1 3 2], [1 2 4], [2 4 1], 3, 4) S = (1,1) 2 (3,2) 4 (2,4) 1 也可以在 sparse 指令加上第六種輸入變數,代表最多可以容納的非零元素個素,使得您可以後續再加入非零元素,而不必改變整個稀疏矩陣的結構

稀疏矩陣範例-3(I) 指令 spdiags,可由對角線元素來建構一個稀疏矩陣 S = spdiags(D, p, m, n)

稀疏矩陣範例-3(II) 範例5-2:sparse02.m S = D = [3 2 9; 2 4 9; 1 1 4]; (1,1) 2 (2,1) 9 (2,2) 4 (3,2) 9 (1,3) 1 (3,3) 1 (4,3) 4 D = [3 2 9; 2 4 9; 1 1 4]; d = [2 0 -1]; S = spdiags(D, d, 4, 3)

稀疏矩陣範例-3(III) 以完全矩陣來顯示,可得 : >> A = full(S) 2 0 1 9 4 0 0 9 1 0 0 4 可看出矩陣 A 的三個非零對角線向量分別是 D 的三個行向量。(在D的第一個行向量中,只用到最後一個元素1。) 提示: D = 3 2 9 2 4 9 1 1 4 d = 2 0 -1

稀疏矩陣範例-4(I) 一般的 load 及 save 指令,也可以處理稀疏矩陣,並儲存於二進制的 MAT 檔案 spconvert指令,可將一個 m×3 的矩陣轉換成稀疏矩陣 第一直行代表列索引 第二直行代表行索引 第三直行則是非零的元素值 檔案 spmat.dat 的內容可顯示如下: >> type spmat.dat 1 1 2 3 2 4 2 4 1 8 3 5

稀疏矩陣範例-4(II) 建構此稀疏矩陣 範例5-3:spconvert01.m S = load spmat.dat (1,1) 2 (1,1) 2 (3,2) 4 (8,3) 5 (2,4) 1 load spmat.dat S = spconvert(spmat)

5-2 稀疏矩陣的儲存空間 一個只包含實數的稀疏矩陣,假設其維度為 m×n,含有 nnz 個非零元素,MATLAB 動用了三個內部陣列來儲存此稀疏矩陣的相關資訊: 第一個陣列:以 double 方式儲存了所有的非零元素,其長度為 nnz,使用的空間為大小 8*nnz 位元組(Bytes)。 第二個陣列:以整數方式儲存了每個元素的列索引,其長度為 nnz,使用的空間大小為 4*nnz 位元組(Bytes)。 第三個陣列:以整數方式儲存了每個直行的起始指標,其長度為 n,使用空間大小為 4*n 位元組(Bytes)。 注意:上述儲存方式僅是用於MATLAB第六版!

稀疏矩陣的儲存空間 整個稀疏矩陣佔用的空間大小為 8*nnz + 4*nnz + 4*n + 4 = 12*nnz + 4*n + 4,多出來的 4 個 bytes 是用來儲存其他經常性資訊 範例5-4:memorySize.m Name Size Bytes Class west0479 479x479 24564 double array (sparse) Grand total is 1887 elements using 24564 bytes clear all load west0479.mat whos

稀疏矩陣的儲存空間 >> 12*(nnz(west0479)) + 4*size(west0479,2) + 4 驗證上述公式 ans = 24564 nnz(west0479) 可傳回稀疏矩陣 west0479 的非零元素個數,其他類似的指令還有 nonzeros(傳回一個包含所有非零元素的行向量)及 nzmax(傳回最大的非零元素個數)

提示 在一個稀疏矩陣中,將一個非零元素設定成零時,MATLAB 並不會自動釋放記憶體空間,換包話說,nnz 會隨著非零元素的減少而減少,但 nzmax 並不會隨著改變 但是多加一個非零元素時,若 nnz 已大於 nzmax 時,nzmax 會隨之增大(即 MATLAB 會自動配置記憶體)以儲存新加的元素

5-3 稀疏矩陣的觀看與圖示 spy 指令可用於觀看稀疏矩陣的非零元素分佈情況 範例5-5:spy01.m 5-3 稀疏矩陣的觀看與圖示 spy 指令可用於觀看稀疏矩陣的非零元素分佈情況 範例5-5:spy01.m load west0479.mat % 載入二進位制檔案 west0479.mat spy(west0479) % 觀看稀疏矩陣的非零元素分佈情況

稀疏矩陣的觀看與圖示 矩陣 west0479 的維度是 479*479,但是只包含 1887 個非零元素,因此此矩陣的密度只有 1887/(479*479) = 0.0082

稀疏矩陣的觀看與圖示 稀疏矩陣特別適用於表示一個「無向圖」(Undirected Graph)的「鄰近矩陣」(Adjacency Matrix),簡單地說,若某圖的第 i 和第 j 個節點有直線連接,則其相對應的鄰近矩陣在第 i 列、第 j 行的元素值為 1,其他元素值則為零

稀疏矩陣的觀看與圖示 稀疏矩陣特別適用於表示一個「無向圖」(Undirected Graph)的「鄰近矩陣」(Adjacency Matrix) 若某圖的第 i 和第 j 個節點有直線連接,則其相對應的鄰近矩陣在第 i 列、第 j 行的元素值為 1,其他元素值則為零 為節省空間,僅用上三角或是下三角矩陣

稀疏矩陣的觀看與圖示 對應的鄰近矩陣可表示成: >> A = spconvert([1 2 1; 2 3 1; 2 4 1; 3 4 1; 3 5 1; 5 6 1; 4 6 1]); >> full(A) ans = 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1

稀疏矩陣的觀看與圖示 假設這 6 個節點的座標如下: 可用 gplot 指令來畫出上述的無向圖: 範例5-6:gplot01.m >> xy = [0 1; 1 2; 1 0; 2 0; 2 2; 3 1]; % 每個列向量是一組座標 可用 gplot 指令來畫出上述的無向圖: 範例5-6:gplot01.m 其中 '-o' 代表以實線('-')及圓圈('o')來作圖 A = spconvert([1 2 1; 2 3 1; 2 4 1; 3 2 1; 3 4 1; 3 5 1; 4 2 1; 4 3 1; 4 6 1; 5 3 1; 5 6 1; 6 4 1; 6 5 1]); xy = [0 1; 1 2; 1 0; 2 0; 2 2; 3 1]; % 每一個列向量是一組 (x, y) 座標 gplot(A, xy, '-o') % 畫出無向圖(Undirected Graph)

稀疏矩陣無向圖

稀疏矩陣有趣的例子-1(I) Bucky 球,此圖包含了 60 個三度空間中的點,每一點和他的三個鄰近點都是等距離,可用 bucky 指令來產生這些點的鄰近矩陣,並用 gplot 來顯示圖形 範例5-7:gplot02.m [A, xy] = bucky; % A 為鄰近矩陣,xy 為座標 gplot(A, xy, '-o'); % 畫出無向圖(Undirected Graph) axis equal % 設定 x 軸和 y 軸的刻度一樣)

稀疏矩陣有趣的例子-1(II)

畫出抽象圖形(I) Treeplot指令來畫出一棵電腦圖學中的樹 範例5-8:treePlot01.m nodes = [0 1 2 2 4 4 4 1 8 8 10 10 11 11 11 11]; treeplot(nodes);

畫出抽象圖形(II) 使用 nodes 向量來代表這一棵樹,其中 node(1)=0 則代表第一個節點是此樹的根節點(Root),而 node(i)=j 代表第 i 個節點的父親是第 j 個節點,例如 node(5)=4 代表第5個節點的父親是第 4 個節點,依此類推

稀疏矩陣有趣的例子-2 是由 NASA (美國太空總署)所主導的計畫,其中包含計算流過機翼的氣流所造成的作用力,由於必須進行偏微分方程的數值運算,所以必須對二維空間進行三角化切割,其鄰近矩陣即為一個稀疏矩陣,您可在 MATLAB 下執行 airfoil 指令即可產生相關圖形,相關說明則記載於 airfoil.m,可經由 type airfoil.m 來檢視之。

5-4 稀疏矩陣的運算 MATLAB 針對完全矩陣設計的運算與函式,也都適用於稀疏矩陣,而且輸出也是大部分以稀疏矩陣的方式來表示 5-4 稀疏矩陣的運算 MATLAB 針對完全矩陣設計的運算與函式,也都適用於稀疏矩陣,而且輸出也是大部分以稀疏矩陣的方式來表示 若計算過程包含稀疏及完全矩陣,則計算結果的表示方式就依情況而變,其規則可見 MATLAB 線上輔助說明

稀疏矩陣的運算 稀疏矩陣的運算還包含下列幾種: 排列(Permutation)及重排(Reordering) 因子分解(Factorization) 線性聯立方程式的求解 固有值及奇異值的計算 這方面的運算,牽涉到很多數學理論,有興趣的讀者,可參考 MATLAB 的手冊,或在 MATLAB 指令視窗下輸入「help sparfun」以取得線上輔助說明

5-5 本章指令彙整 指令 功能 B = sparse(A) 將一個完全矩陣 A 轉換成稀疏矩陣 B 5-5 本章指令彙整 指令 功能 B = sparse(A) 將一個完全矩陣 A 轉換成稀疏矩陣 B B = sparse(i, j, s, m , n ) 直接產生一個稀疏矩陣 B,其中 : i 是列索引 j 是行索引 s 是非零元素形成的向量 m 是 B 的列維度 n 是 B 的行維度 i、j、s 都是長度相同的向量 B = spdiags(D, p, m, n) 由矩陣 D 的對角線元素來建構一個稀疏矩陣 B,其中: D 的每一個直行代表矩陣的對角線向量 p 代表對角線的位置(0 代表主對角線,-1 代表向下位移一單位的次對角線,1 代表向上位移一單位的次對角線,依此類推) m 與 n 則分別代表矩陣的列維度與行維度 full(B) 以完全矩陣來顯示矩陣 B

5-5 本章指令彙整 spconvert(C) 將一個 m×3 的矩陣 C,轉換成稀疏矩陣,其中: 第一直行代表列索引 第二直行代表行索引 5-5 本章指令彙整 spconvert(C) 將一個 m×3 的矩陣 C,轉換成稀疏矩陣,其中: 第一直行代表列索引 第二直行代表行索引 第三直行則是非零的元素值 nnz(C) 傳回稀疏矩陣 C 的非零元素個數 nonzeros(C) 傳回稀疏矩陣 C 的所有非零元素形成的行向量 nzmax(C) 傳回稀疏矩陣 C 的目前可容納非零元素個數的最大值,當nnz > nzmax 時,MATLAB 會動態調增配置記憶體給 nzmax,以儲存新增的非零元素 spy(C) 觀看稀疏矩陣 C 的非零元素分佈情況 gplot(A, xy, '-o'); 畫出無向圖(Undirected Graph) treeplot(nodes) 畫出樹狀圖