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

时间:2016-04-08 15:49:46

标签: python numpy scipy linear-algebra sparse-matrix

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

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

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

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

由于每个单独的Lx1,Lx2等矩阵是按顺序计算的,所以它们被附加到列表中 - 我无法找到一种方法来填充类似数组的对象"在飞行中#34;。

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

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他们在一起?

参考:类似的MATLAB代码,用于计算n自旋核磁共振模拟的哈密顿矩阵,可以在这里找到:

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

2 个答案:

答案 0 :(得分:1)

这是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

答案 1 :(得分:0)

使用稀疏矩阵和使用数组数组,我可以通过而不是获得十倍的速度提升。

var codepages = Encoding.GetEncodings().Select(e => new {e.DisplayName, e.Name, e.CodePage}) .ToList().Dump();

在生成它们时,它们将填充各个Lx数组(以前称为稀疏矩阵)。使用阵列结构允许转置和笛卡尔积产品按要求执行:

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

单个Lx [n]矩阵仍然是&#34;捆绑&#34;,因此Product是n x n矩阵。这意味着n x n J阵列的就地乘法与Lproduct有效:

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

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

scalars = np.multiply(J, Lproduct)

相关问题