建設的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
是'矩陣'None
與DD2
沿着對角線。然後它將這些傳遞給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個數組。
我清理了一下顯示器。你需要更具體地說明爲什麼這種方式不適用於更大的'n'。 (什麼是'n1'?)'block_diag'和'bmat'是開放的Python代碼,所以你可以研究它們,如果需要的話,簡化行動以適應你的情況。 – hpaulj
'bmat'最終將'DD2'轉換爲'coo'格式,將它們的'data','row','col'連接成3個大數組,並從中創建一個新的'coo'。 – hpaulj
重點是我不想寫下block_diag(DD2,.......,DD2)thousend時間,肯定它會工作,但不是有像block_diag((DD2,:)直到n )? – Zitzero