2015-12-06 51 views
0

我有一個相當簡單的問題,但仍然無法使它工作。 我想要一個塊對角n^2 * n^2矩陣。塊是稀疏的n×n矩陣,只有對角線,首先出對角線,然後離開diag。對於n=4簡單的情況下,這很容易做到如何重複使用block_diag

datanew = ones((5,n1)) 
datanew[2] = -2*datanew[2] 
diagsn = [-4,-1,0,1,4] 
DD2 = sparse.spdiags(datanew,diagsn,n,n) 
new = sparse.block_diag([DD2,DD2,DD2,DD2]) 

由於這僅適用於小的N的有用的,有沒有辦法更好的方式來使用block_diag? n個思考 - > 1000

+0

我清理了一下顯示器。你需要更具體地說明爲什麼這種方式不適用於更大的'n'。 (什麼是'n1'?)'block_diag'和'bmat'是開放的Python代碼,所以你可以研究它們,如果需要的話,簡化行動以適應你的情況。 – hpaulj

+0

'bmat'最終將'DD2'轉換爲'coo'格式,將它們的'data','row','col'連接成3個大數組,並從中創建一個新的'coo'。 – hpaulj

+0

重點是我不想寫下block_diag(DD2,.......,DD2)thousend時間,肯定它會工作,但不是有像block_diag((DD2,:)直到n )? – Zitzero

回答

0

建設的DD2矩陣一長列的簡單方法,就是用一個列表理解:

In [128]: sparse.block_diag([DD2 for _ in range(20)]).A 
Out[128]: 
array([[-2, 1, 0, ..., 0, 0, 0], 
     [ 1, -2, 1, ..., 0, 0, 0], 
     [ 0, 1, -2, ..., 0, 0, 0], 
     ..., 
     [ 0, 0, 0, ..., -2, 1, 0], 
     [ 0, 0, 0, ..., 1, -2, 1], 
     [ 0, 0, 0, ..., 0, 1, -2]]) 

In [129]: _.shape 
Out[129]: (80, 80) 

至少在我的版本,block_diag要陣列的列表,而不是*args

In [133]: sparse.block_diag(DD2,DD2,DD2,DD2) 
... 
TypeError: block_diag() takes at most 3 arguments (4 given) 

In [134]: sparse.block_diag([DD2,DD2,DD2,DD2]) 
Out[134]: 
<16x16 sparse matrix of type '<type 'numpy.int32'>' 
    with 40 stored elements in COOrdinate format> 

這可能不是構建這種塊對角線陣列的最快方法,但它是一個開始。

================

看着爲sparse.block_mat的代碼,我推斷出它的作用:

In [145]: rows=[] 
In [146]: for i in range(4): 
    arow=[None]*4 
    arow[i]=DD2 
    rows.append(arow) 
    .....:  

In [147]: rows 
Out[147]: 
[[<4x4 sparse matrix of type '<type 'numpy.int32'>' 
    with 10 stored elements (5 diagonals) in DIAgonal format>, 
    None, 
    None, 
    None], 
[None, 
    <4x4 sparse matrix of type '<type 'numpy.int32'>' 
    ... 
    None, 
    <4x4 sparse matrix of type '<type 'numpy.int32'>' 
    with 10 stored elements (5 diagonals) in DIAgonal format>]] 

換句話說,rows是'矩陣'NoneDD2沿着對角線。然後它將這些傳遞給sparse.bmat

In [148]: sparse.bmat(rows) 
Out[148]: 
<16x16 sparse matrix of type '<type 'numpy.int32'>' 
    with 40 stored elements in COOrdinate format> 

反過來bmat從所有輸入matricies的coo格式收集data,rows,cols,將其拼接爲主陣列,和由它們生成一個新coo矩陣。

所以另一種方法是直接構建這3個數組。