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

杰弗里·萨默茨

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

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

我有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之类的选项似乎需要将数组作为输入,而我有列表。

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

参考:可以在此处找到用于计算n旋NMR模拟的汉密尔顿矩阵的类似MATLAB代码:

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

杰弗里·萨默茨

通过使用稀疏矩阵和数组数组,我能够将速度提高十倍

Lx = np.empty((1, nspins), dtype='object') Ly = np.empty((1, nspins), dtype='object') Lz = np.empty((1, nspins), dtype='object')

它们在生成时会被各个Lx数组(以前为稀疏矩阵)填充。使用数组结构可使转置和笛卡尔积按需执行:

Lcol = np.vstack((Lx, Ly, Lz)).real Lrow = Lcol.T # As opposed to sparse version of code, this works! Lproduct = np.dot(Lrow, Lcol)

各个Lx [n]矩阵仍处于“捆绑”状态,因此乘积为nxn矩阵。这意味着nxn J数组与Lproduct的就地乘法工作:

scalars = np.multiply(J, Lproduct)

然后将每个矩阵元素添加到最终的哈密顿矩阵上:

for n in range(nspins): for m in range(nspins): M += scalars[n, k].real

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章