1. 程式人生 > >matble中spdiags()函式 (翻譯+理解)

matble中spdiags()函式 (翻譯+理解)

翻譯來源      matble中的help spdiags               

轉載請註明出處https://blog.csdn.net/zhmjunjun/article/details/79790957   謝謝

spdiags函式推廣了斜對角函式的應用,可以進行四種不同的操作,如下:

B = spdiags(A)     從m-by-n矩陣A中提取所有非零對角。B是一個min(m,n)-by-p矩陣,其列是A矩陣的p非零對角

[B,d] = spdiags(A) 返回長度為p的向量d,其整數部分對應A中的對角線(非零對角元素)。

B = spdiags(A,d) 提取d指定的對角線。

A = spdiags(B,d,A)

 將d指定的對角線替換為B列,輸出是稀疏的。

A = spdiags(B,d,m,n) 通過獲取B的列並將它們放置在d指定的對角線上,建立一個m-by-n稀疏矩陣。.

A:  m-by-n矩陣,通常(但不一定)稀疏,其非零或指定元素位於p對角上.

B:  最小(m,n)-by-p矩陣,p為矩陣A非零斜對角線條數。

d:  長度為p的向量,是每一條非零斜對角線對應的計數標,,所以向量d的長度為p,因為矩陣A有p條非零斜對角。

Roughly, AB, and d are related by

for k = 1:p
    B(:,k) = diag(A,d(k))
end
A的對角是如何在向量d中列出的

m-by-n 的矩陣A具有m+n-1個對角.它們是在向量d中使用從-m+1到n-1的索引指定的。

A為5X6的矩陣,矩陣A對應10個對角,分別用-4,-3,……,4,5標記。

如下圖:

例項列舉幫助理解——————————————————————————————————

A=[0 5 0 10 0 0;...
0 0 6 0 11 0;...
3 0 0 7 0 12;...
1 4 0 0 8 0;...
0 2 5 0 0 9]


[B, d]  =spdiags(A)

%%min(size(A))=5;   因此5為B矩陣的列,非零斜對角為B矩陣的行,

%%因為size(A)將輸出矩陣A的  行 與 列,這裡分別是5  與  6。    因此  min(size(A))=5

第一個輸出B的列包含A的非零對角,第二個輸出d列出A的非零對角的索引,如下圖所示


請注意,A中最長的非零對角線包含在B的第3列中,A的其他非零對角線在B中相應的列中添加了額外的零,使B的所有列都具有相同的長度。對於A的主對角線以下的非零對角線,在列的頂部加上額外的零。對於A的主對角線以上的非零對角線,在列的底部加上額外的零。下圖說明了這一點。


例二:此示例生成n點上經典的第二差分運算元的稀疏三對角表示。(這個例子不好看出相互關係,但下一個例子可以看出一些)

e = ones(n,1);
A = spdiags([e -2*e e], -1:1, n, n)
%Turn it into Wilkinson's test matrix (see gallery):

A = spdiags(abs(-(n-1)/2:(n-1)/2)',0,A)
%Finally, recover the three diagonals:

B = spdiags(A)

執行程式碼時,將n具體化

 例三     

A = [11    0   13    0
      0   22    0   24
      0    0   33    0
     41    0    0   44
      0   52    0    0
      0    0   63    0
      0    0    0   74]
%   Here m =7, n = 4, and p = 3.  p為非零斜對角線條數

[B,d] = spdiags(A)    
 d = [-3 0 2]' 
B = [41   11    0
     52   22    0
     63   33   13
     74   44   24]

相反,對於上面的B和d,表示式spdiags(B,d,7,4)複製了原始的A。

為什麼是7,4?因為想要還原的 原始矩陣A(為4X7的矩陣)

>> spdiags(B,d,7,4)
%    d是對應的非零斜對角的位置; 7,4.為構建一個列為7,行為4的矩陣,除了將矩陣B的元素,按照d非零斜對角線的位置還原,其餘都填補0;
%    結果為,這些正好對應於原始矩陣A的相應位置,按A矩陣的列表示。(因為A矩陣正好是列為7,行為4的矩陣)
ans =
   (1,1)       11
   (4,1)       41
   (2,2)       22
   (5,2)       52
   (1,3)       13
   (3,3)       33
   (6,3)       63
   (2,4)       24
   (4,4)       44
   (7,4)       74

例四 此示例演示了當B列 比要替換的對角線長時;spdiags如何建立對角線。(方法一樣,就是將多餘部分刪除,負數順序,正數倒序錄入,,自己畫一下就一下子理解了)    ,repmat(A,n,m)函式主要功能是,矩陣塊的複製。將矩陣A當做塊,填充矩陣nXm。  具體可以在matble中,輸入:    help repmat

B = repmat((1:6)',[1 7])

B =

    1  1  1  1  1  1  1
    2  2  2  2  2  2  2
    3  3  3  3  3  3  3
    4  4  4  4  4  4  4
    5  5  5  5  5  5  5
    6  6  6  6  6  6  6

d = [-4 -2 -1 0 3 4 5];
A = spdiags(B,d,6,6);
full(A)

ans =

  1  0  0  4  5  6
  1  2  0  0  5  6
  1  2  3  0  0  6
  0  2  3  4  0  0
  1  0  3  4  5  0
  0  2  0  4  5  6

三個圖例,將A=spdiags(B,d,n,m)的所以轉化情況都給出了,

當A矩陣行<=列時,下對角順序;上對角逆序

當A矩陣行>列時,下對角逆序;上對角順序



三個圖例將    B = spdiags(A) 的所有情況表示出來


當A矩陣行<=列時,下對角順序;上對角逆序

當A矩陣行>列時,下對角逆序;上對角順序