python - 从子矩阵列表创建稀疏矩阵 (Python)

标签 python numpy scipy linear-algebra sparse-matrix

这是我的第一个 SO 问题。让我知道我是否可以问得更好 :)

我正在尝试找到一种方法将稀疏矩阵列表拼接成更大的 block 矩阵。

我有 python 代码,可以逐个矩阵生成稀疏方矩阵列表。在伪代码中:

Lx = [Lx1, Lx1, ... Lxn]
Ly = [Ly1, Ly2, ... Lyn]
Lz = [Lz1, Lz2, ... Lzn]   

由于每个单独的 Lx1、Lx2 等矩阵都是按顺序计算的,因此它们被附加到列表中——我找不到一种方法来“即时”填充类似数组的对象。

我正在优化速度,瓶颈是逐项计算笛卡尔积,类似于伪代码:

M += J[i,j] * [ Lxi *Lxj + Lyi*Lyj + Lzi*Lzj ] 

对于 0 <= i, j <= n 的所有组合。 (J是n维数字方阵)。

似乎通过(伪代码)一步计算所有笛卡尔积来对其进行矢量化:

L = [ [Lx1, Lx2, ...Lxn],
      [Ly1, Ly2, ...Lyn],
      [Lz1, Lz2, ...Lzn] ]
product = L.T * L

会更快。但是,np.bmat、np.vstack、np.hstack 等选项似乎需要数组作为输入,而我有列表。

有没有办法有效地将三个矩阵列表拼接成一个 block ?或者,有没有一种方法可以一次生成一个稀疏矩阵数组,然后将它们 np.vstack 在一起?

引用:可在此处找到类似的 MATLAB 代码,用于计算 n-自旋 NMR 模拟的哈密顿矩阵:

http://spindynamics.org/Spin-Dynamics---Part-II---Lecture-06.php

最佳答案

这是 scipy.sparse.bmat :

L = scipy.sparse.bmat([Lx, Ly, Lz], format='csc')
LT = scipy.sparse.bmat(zip(Lx, Ly, Lz), format='csr') # Not equivalent to L.T
product = LT * L

关于python - 从子矩阵列表创建稀疏矩阵 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36504001/

相关文章:

python - 在python中导入C dll函数

python - 在 ubuntu 上运行 dockerfile 时 django 安装失败

python - Numpy 矢量化和加速

python - 在 Python 中旋转图像 - 提高质量 - Scipy

python - Unicode解码错误: 'utf8' codec can't decode byte 0xba in position 1266: invalid start byte

python - 如何从 tf.estimator 获取默认 session ?

python - FFTW 向后变换乘以 N

python - 编写函数以处理向量和矩阵

python-2.7 - Scipy安装cygwin64 Windows10后期失败

python - scipy最小二乘法中的正交回归拟合