在Python(Scipy/Numpy)中组装矩阵

3
我想知道在Python中是否有一种简便的方法来沿对角线组装矩阵,如果它们重叠,则添加值。这是我从Matlab论坛偷来的一个方便的图示:https://istack.dev59.com/ZunrZ.webp 目前,我正在尝试使用一组预定数量的2x2矩阵来实现它,但最终目标是使代码组装任意数量和任意大小的矩阵(当然都是相同大小的,最大为4x4)。

如果它们是3x3的子矩阵,您希望重叠是1个元素还是4个元素? - wim
我不太确定……在我创建的模型中,我计划只有一个重叠部分。但是,为了完成我正在做的事情,我可能需要更复杂的情况。尽管如此,现在我只需要一个角落的重叠部分。 - Preslav Aleksandrov
这看起来很像有限元建模中从单元矩阵组装全局刚度矩阵的汇编过程。scipy.sparse在将coo格式矩阵转换为csr格式矩阵时会执行此操作,与MATLAB处理其稀疏矩阵的方式非常相似。 - hpaulj
请参见此页面上有关有限元构造的参考资料:https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.html#scipy.sparse.coo_matrix - hpaulj
1
这个看起来相关:https://dev59.com/NKLms4cB2Jgan1znKTH2 - Warren Weckesser
1
将n个子矩阵编译成numpy中的NxN矩阵。 - hpaulj
2个回答

3
我不确定如何将其向量化,但你可以通过setitem直接完成:

我不确定如何将其向量化,但你可以通过setitem直接完成:

k = k1 = np.array([[1,2],[3,4]])   # etc
ks = [k1, k2, k3, k4]
[n] = set(k.shape)
N = len(ks)
A = np.zeros((N+1, N+1))
for i, k in enumerate(ks):
    A[i:i+n, i:i+n] += k

非常感谢!!!快速跟进一下,np是否有一种方法可以存储/分配每个子矩阵在其内部的位置,以便我可以按不同顺序或方向组装它们?即,不使用矩阵的索引来定位,而是使用存储在矩阵内部的值。 - Preslav Aleksandrov
不,它不会 - 你必须浪费一整行和一整列来将其存储在矩阵本身中。更好的方法是使用一对列表(ndarray,idx)。 - wim
再次感谢,这非常适合我当前的工作。 - Preslav Aleksandrov

1

首先,我们来看一个在5x5矩阵上使用两个2x2矩阵的例子:

import numpy as np
M = np.zeros((5,5))
M1 = np.matrix([[1,2],[3,4]])
M2 = np.matrix([[1,2],[3,4]])
M[:2,:2] += M1
M[1:3, 1:3] += M2
M

产生的结果
array([[ 1.,  2.,  0.,  0.,  0.],
   [ 3.,  5.,  2.,  0.,  0.],
   [ 0.,  3.,  4.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.]])

一般来说,如果您有一个大小为KxK的零矩阵M,以及K-r+1个rxr大小的可索引矩阵,您可以执行以下操作:
for i in range(K-r+1): 
    M[i+r:i+r] += matrices[i]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接