【发布时间】:2016-07-29 23:26:53
【问题描述】:
这是我的第一个 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
似乎通过(伪代码)一步计算所有笛卡尔积来对其进行矢量化:
L = [ [Lx1, Lx2, ...Lxn],
[Ly1, Ly2, ...Lyn],
[Lz1, Lz2, ...Lzn] ]
product = L.T * L
会更快。但是,np.bmat、np.vstack、np.hstack 等选项似乎需要数组作为输入,而我有列表。
有没有办法有效地将三个矩阵列表拼接成一个块?或者,有没有办法一次生成一个稀疏矩阵数组,然后将它们 np.vstack 在一起?
参考:用于计算 n-spin NMR 模拟的哈密顿矩阵的类似 MATLAB 代码可在此处找到:
http://spindynamics.org/Spin-Dynamics---Part-II---Lecture-06.php
【问题讨论】:
-
欢迎来到 Stack Overflow!第一个问题问得好。 :-)
-
小矩阵从何而来,采用什么稀疏矩阵格式?
-
每个 Lxn 矩阵由这些基本矩阵的重复 kron 计算:
codesigma_x = csc_matrix(np.matrix([[0, 1/2], [1/2, 0]]) ) sigma_y = csc_matrix(np.matrix([[0, -1j/2], [1j/2, 0]])) sigma_z = csc_matrix(np.matrix([[1/2, 0], [0, - 1/2]])) 单位 = csc_matrix(np.matrix([[1, 0], [0, 1]]))code -
(抱歉回复中的格式:我是新人!:))
-
每个 Lxn 矩阵都是由这些基本矩阵的重复克朗计算的:
sigma_x = csc_matrix(np.matrix([[0, 1/2], [1/2, 0]]))、sigma_y = csc_matrix(np.matrix([[0, -1j/2], [1j/2, 0]]))、sigma_z = csc_matrix(np.matrix([[1/2, 0], [0, -1/2]]))、unit = csc_matrix(np.matrix([[1, 0], [0, 1]]))
标签: python numpy scipy linear-algebra sparse-matrix