将矩阵转换为 LAPACK 的最快实现
Fastest implementation to convert a matrix to LAPACK
我有一个函数可以将矩阵转换为 SciPy 中的 LAPACK 例程所需的内容。我写了简短的代码来说明我的工作:
import numpy as np
import time
N = 3
def convert_matrix_lapack(Amat,out):
for ii in range(N):
out[(2*N-2-ii):(3*N-2-ii), ii] = Amat[:, ii]
A = np.arange(N**2).reshape(N, N)
A_lapack = np.zeros((3*N-2,N), dtype=np.float)
tt = time.time()
convert_matrix_lapack(A, A_lapack)
print(time.time() - tt)
在实践中通用矩阵(N=3),
>>> A
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
变成
>>> A_lapack
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 2.],
[0., 1., 5.],
[0., 4., 8.],
[3., 7., 0.],
[6., 0., 0.]])
如何使用 NumPy 中的内置函数来固定任意 N 的代码(我的目标是 N 小于 50)?
这应该有效:
from scipy.sparse import diags
import numpy as np
N = 3
A = np.arange(N**2).reshape(N,N)
offsets = np.arange(-N+1, 1)
A_lapack = np.flipud(diags(A, offsets, shape=(3*N-2, N)).toarray())
工作原理:
- 它使用
scipy.sparse.diags
创建一个稀疏对角矩阵
- 使用
numpy.flipud
将其上下翻转
如果我们包括使用 np.zeros
的数组分配步骤,速度是可比的,但对于 N=100
:
的数组速度较慢
- 0.00021839141845703125秒(原码)
- 0.0017552375793457031 秒(我的解决方案)
我有一个函数可以将矩阵转换为 SciPy 中的 LAPACK 例程所需的内容。我写了简短的代码来说明我的工作:
import numpy as np
import time
N = 3
def convert_matrix_lapack(Amat,out):
for ii in range(N):
out[(2*N-2-ii):(3*N-2-ii), ii] = Amat[:, ii]
A = np.arange(N**2).reshape(N, N)
A_lapack = np.zeros((3*N-2,N), dtype=np.float)
tt = time.time()
convert_matrix_lapack(A, A_lapack)
print(time.time() - tt)
在实践中通用矩阵(N=3),
>>> A
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
变成
>>> A_lapack
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 2.],
[0., 1., 5.],
[0., 4., 8.],
[3., 7., 0.],
[6., 0., 0.]])
如何使用 NumPy 中的内置函数来固定任意 N 的代码(我的目标是 N 小于 50)?
这应该有效:
from scipy.sparse import diags
import numpy as np
N = 3
A = np.arange(N**2).reshape(N,N)
offsets = np.arange(-N+1, 1)
A_lapack = np.flipud(diags(A, offsets, shape=(3*N-2, N)).toarray())
工作原理:
- 它使用
scipy.sparse.diags
创建一个稀疏对角矩阵
- 使用
numpy.flipud
将其上下翻转
如果我们包括使用 np.zeros
的数组分配步骤,速度是可比的,但对于 N=100
:
- 0.00021839141845703125秒(原码)
- 0.0017552375793457031 秒(我的解决方案)