import scipy as sp
import numpy as np
def H1(M1, M2, N):
row = [0, 1]
col = [0, 0]
data = [M1, M2]
return sp.sparse.bsr_matrix((data, (row,col)), blocksize=(2,2), shape=(N,N)).toarray()
M1 = np.array([[1,1], [1,1]])
M2 = np.array([[2,2], [2,2]])
print(H1(M1, M2, 6))
line 248, in getnnz
raise ValueError('row, column, and data arrays must be 1-D')
ValueError: row, column, and data arrays must be 1-D
我不太确定为什么会出现这个错误,因为bsr_matrix允许数据数组是二维的。
文档显示,只要定义了块大小,它就应该工作。知道为什么会出现这个错误吗?
实际上我的主要任务是沿着对角线迭代M1,然后在M1下面迭代M2,得到一个300 x 300的矩阵,有人有更好的方法吗?
1条答案
按热度按时间eivnm1vs1#
使用FULL回溯的函数调用:
关键是对于一个2元素的
arg1
,它试图建立一个coo
矩阵,然后将其转换为bsr
。它没有以特殊的bsr
方式处理输入。文档应该更清楚。换句话说,当
a[ij[0, k], ij[1, k]] = data[k]
时,data
是一个一维数组,而不是一个三维数组,所以ij
的值是普通的coo
的行和列。如果你想提供块和块"坐标",你必须使用
csr
样式的输入。coo_matrix
具有类似的描述A[i[k], j[k]] = data[k]
,这支持了bsr_matrix((data, ij), [blocksize=(R,C), shape=(M, N)])
就是coo_matrix((data,ij), shape=(M,N)).tobsr(blocksize=(R,C))
的想法你对对角线上迭代M1的描述并不明显,听起来就像你在尝试:
转换为
bsr
后,我们可以看到bsr_matrix
输入应该是什么样子:还有一个块对角输入:
在[83]中:M1 =稀疏块诊断([M1,M1,M1],格式="bsr")
在[84]中:M1
您可能会发现
sparse.bmat
的代码很有启发性,它构造了所有块的coo
版本,然后将它们的data,row,col
加入到3个数组中,然后使用这些数组创建一个新的大coo
。block_diag
也使用了这个集合coo
方法。'raw'
coo
输入是稀疏矩阵的原始输入形式,并且仍然是最基本的样式。多年前,当我在MATLAB中使用FEM时,有效构建这三个coo
输入是制作刚度矩阵的最大部分。编辑
csr
样式输入为: