2011-10-13 101 views
4

我正在嘗試使用blkdiagspdiags構建正方形band matrices,但無法弄清楚如何。我發現spdiags的文檔有點令人困惑,我不確定我可以通過簡單調用blkdiag來構建這些矩陣。學習在MATLAB中創建帶矩陣

我想從兩個參數建立的正方形帶矩陣:

  • 所述帶的寬度
  • 矩陣大小

例如:

band_width = 2; 
matrix size = 9; 

結果:

[1 1 1 0 0 0 0 0 0] 
[1 1 1 1 0 0 0 0 0] 
[1 1 1 1 1 0 0 0 0] 
[0 1 1 1 1 1 0 0 0] 
[0 0 1 1 1 1 1 0 0] 
[0 0 0 1 1 1 1 1 0] 
[0 0 0 0 1 1 1 1 1] 
[0 0 0 0 0 1 1 1 1] 
[0 0 0 0 0 1 1 1 1] 
[0 0 0 0 0 0 1 1 1] 
+0

這是你的意圖產生1和0的矩陣在你的榜樣,或者是你將要填充不同的值對角線? – gnovice

+0

謝謝@gnovice。如例子中的1和0,但帶寬和矩陣大小可以變化。 –

回答

6

一個棘手的線的方式來創建這樣的矩陣是與卷積:

M = sign(conv2(eye(matrix_size),ones(band_width+1),'same')); 

identity matrix創建給定尺寸的,然後convolved in 2-Dsquare matrix of ones,然後通過取轉化成零和一sign

以上對於製作相對較小的非稀疏矩陣來說很好。對於較大的矩陣,卷積可能會變得昂貴,您可能想要將結果表示爲sparse matrix。這裏是你如何使用SPDIAGS一般的方式做到這一點:

M = spdiags(ones(matrix_size,2*band_width+1),... 
      -band_width:band_width,matrix_size,matrix_size); 
+1

這是一個很棒的伎倆!實際上我發現這個解決方案非常優雅 –