目錄

20200718 想法源起 20200719 我們在做什麼(一) 20200722 我們在做什麼(二) 20200725 竟然成為數學家(一) 20200729 竟然成為數學家(二) 20200801 竟然成為數學家(三) 20200805 不同職級(一) 20200808 不同職級(二) 20200812 趕客系列(一)為什麼讀大學? 20200815 趕客系列(二)不同大學學位跟工作的關係 20200819 趕客系列(三)大學的目的 20200822 趕客系列(四)大學為什麼要有主修 20200826 趕客系列(五)要挑選一個什麼樣的主修 20200829 沒有無緣無故的恨(一) 20200831 科普系列 - 數學與電影動畫製作(一) 20200902 沒有無緣無故的恨(二) 20200905 沒有無緣無故的恨(三) 20200907 科普系列 - 數學與電影動畫製作(二) 20200909 終身職位的評核 20200912 學術界吸引人的地方 20200914 科普系列 - 數學與電影動畫製作 (三) 20200916 學術界辛苦的地方(一) 20200919 學術界辛苦的地方(二) 20200921 科普系列 - 數學與電影動畫製作 (四) 20200923 大學的讀書成績有多重要 20200926 本科生研究機會 20200928 科普系列 - 數學與圖像修復(一) 20200930 用創新的方法去教育科學 20201003 參加研討會的重要 20201005 科普系列 - 數學與圖像修復(二) 20201007 教授與教學 20201010 研究是什麼(一) 20201012 科普系列 - 數學與圖像修復(三) 20201014 研究是什麼(二) 20201017 研究是什麼(三) 20201019 科普系列 - 數學與圖像修復(四) 20201021 如何閱讀研究論文 20201024 研究生應該修什麼課 20201026 科普系列 - 數學與圖像修復(五) 20201029 本科生的多主修多副修 20201102 科普系列 - 數學與數獨(一) 20201105 幾位教授(一) 20201109 科普系列 - 數學與數獨(二) 20201112 幾位教授(二) 20201116 科普系列 - 數學與數獨(三) 20201119 幾位教授(三) 20

計算數學入門系列 - 矩陣的儲存(二)



上面這個例子,我們就設定了一個中等大小的矩陣,在一些問題裏面已經非常有用。可是有一點要特別小心,如果這個變量n 是更大,就比如說30000 ,上面這個方法就已經對電腦的儲存空間造成很大的負擔。主要的問題是,定義一個30000×30000 的矩陣,電腦就必須儲存9 千萬個數字。在MATLAB 內,就需要差不多1.8GB 的內存空格。


要解決這個問題,我們可以看見這9 千萬個數字裏面大部份都是0,而且這些數字在運算過程內我們可能根本沒有機會用到。所以雖然說1.8GB 的儲存空間,可是大部份根本沒有機會用到而浪費掉了。當我們要處理這些非常大的稀疏矩陣,我們可以使用MATLAB 另一個矩陣儲存方式,我們只需要把矩陣內不是0的地方標示出來就可以了。 以上面一個10×10的三對角矩陣為例,我們知道這個矩陣一共有10+9+9=28 個不是0的元素,所以我們可以先設定


>> D=zeros(28,3);


D 是一個28×3的矩陣,每一橫行代表着一個不是等於0元素。我們會用前兩個數字 去代表位置,最後一個代表他的數值。


>> D(1:10,1)=1:10;

>> D(1:10,2)=1:10;

>> D(1:10,3)=-2;


這樣,我們就把矩陣的對角線上的元素定義好。再把


>> D(11:19,1)=1:9;

>> D(11:19,2)=2:10;

>> D(11:19,3)=1;

>> D(20:28,1)=2:10;

>> D(20:28,2)=1:9;

>> D(20:28,3)=1;


矩陣內所有不是零的元素都已經定義後,我們再用


>> D=spconvert(D);


這個稀疏矩陣就完成了。這個方法的問題,是如果矩陣的大小有所改變,我們就必須要把不是零元素的數目重新設定,然後很小心的把位置計算清楚。但是,如果我們所需要定義的矩陣並沒有一些特別的特徵,我們很可能還是要用這個方法把元素一個一個的設定出來。


比較方便改變的方法,可以使用MATLAB內置函數speyes 或spdiags


>> n=30000;

>> tmp = ones(n,1);

>> E = spdiags([tmp -2*tmp tmp], -1:1, n, n);

>> whos

Name Size Bytes Class Attributes

E 30000x30000 1679976 double sparse

n 1x1 8 double

tmp 30000x1 240000 double


我們可以看見,雖然E是一個30000×30000矩陣,但是他只需要1.7MB的內存空間。


你會問,為什麼我們只關心稀疏矩陣的定義呢?簡單的來說,是由於很多在應用數學的問題,都只涉及局部資訊(Local Information)而很少需要整體(Global)的訊息。而這些局部資訊的關聯性,就顯示在矩陣的係數裏面。在社會隔離的數學模型,又或者是生命遊戲的程式編寫內,我們都只考慮在鄰近地區對每一方格的影響。所以,當我們把整個數學模型寫出來,就可以看見一個稀疏的矩陣。 在圖像修復的討論裏面,我們也只考慮每一像素旁邊的顏色,所以得出的矩陣也會是稀疏的。當然,在一些紋理圖像修復的數學模型,我們就需要考慮圖像整體的結構,所得出的矩陣就很可能是一個全矩陣。



留言