有没有一种更快的方法可以从多个矩阵中创建3x3矩阵,用于使用numpy计算特征值和特征向量



我正在尝试计算多个3x3矩阵的特征值和特征向量。我有6个(e11,e12,e13,e22,e23,e33(mxn形矩阵,每个3x3矩阵都是使用这6个矩阵中的每个元素形成的。这6个矩阵中的元素数量以千为单位。现在我只需要循环这些矩阵,每次创建一个3x3矩阵,计算特征值和特征向量,计算大约需要10分钟。我知道一定有更好的办法。我不是python方面的专家,所以如果能帮助我加快代码速度,我将不胜感激。

请参阅下面的代码:

for i in range(0,m):
for j in range(0,n):
E = np.array([ [e11[i][j], e12[i][j], e13[i][j]],
[e12[i][j], e22[i][j], e23[i][j]],
[e13[i][j], e23[i][j], e33[i][j]] ])
e_val, e_vec = np.linalg.eig(E)

如果我创建一组(3,4(数组,我可以将它们与组合

In [149]: e11,e12,e22 = [np.ones((3,4))*i for i in range(1,4)]
In [150]: E1=np.stack((np.stack([e11,e12],-1), np.stack([e12,e22],-1)),-1)
In [151]: E1.shape
Out[151]: (3, 4, 2, 2)

可以传递给eig以生成:

In [153]: np.linalg.eig(E)[0].shape
Out[153]: (3, 4, 2)

我让你概括一下你的(3,3(情况

根据@hpaulj的建议,我将代码修改如下,将计算时间从10分钟减少到40秒。

E = np.stack([
np.stack([e11,e12,e13],-1),
np.stack([e12,e22,e23],-1),
np.stack([e13,e23,e33],-1)],-1)
e_val, e_vec = np.linalg.eig(E)

因此现在CCD_ 2和CCD_。

最新更新