gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:32:59 24 4
gpt4 key购买 nike

这是我的第一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com