【问题标题】:Assembling matrices in python (scipy/numpy)在 python (scipy/numpy) 中组装矩阵
【发布时间】:2018-05-08 06:01:37
【问题描述】:

我想知道是否有一种简单的方法可以在 python 中沿对角线组装矩阵,如果它们重叠则添加值。这是我从 Matlab 论坛偷来的一张方便的图表:https://i.stack.imgur.com/ZunrZ.jpg

目前,我正在尝试实现它以使用一组 2x2 矩阵,但最终目标是使代码组装任意数量的任意大小的矩阵(所有相同大小的 c.,最大 4x4)。

【问题讨论】:

  • 如果它们是 3x3 子矩阵,您希望重叠如何? 1 个元素重叠,还是 4 个元素重叠?
  • 我不太确定......在模型中,我正在创建我计划只有 1 个重叠。但它可能会变成我正在做的事情,我可能需要更复杂的场景。不过,就目前而言,我正在寻找的只是一个角落重叠。
  • 这看起来很像为有限元建模从单元中组装全局刚度矩阵。 scipy.sparse 在从 coo 转换为 csr 格式矩阵时执行此操作,这与 MATLAB 处理其稀疏矩阵的操作非常相似。

标签: python numpy matrix scipy


【解决方案1】:

我不知道如何向量化这个,但你可以直接用 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 是否有办法在其内部存储/分配每个子矩阵的位置,以便我可以乱序或按不同方向组装它们?即不是使用矩阵的索引来定位使用存储在矩阵中的值。
  • 不,它没有 - 您必须浪费一整行和一列才能将其存储在矩阵本身中。最好使用对列表(ndarray,idx)。
  • 再次感谢,这非常适合我的工作。
【解决方案2】:

首先是一个 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 matrices 在某些可索引中,你可以这样做

for i in range(K-r+1): 
    M[i+r:i+r] += matrices[i]

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 2011-08-30
    • 2013-11-11
    • 2011-08-18
    • 2016-01-24
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多