获取许多一维数组的特征值的最快方法

fastest way to get eigenvalues of many 1d array

我有一个 (n, m, 6) 数组,其中 n 和 m 大于 10.000。这 6 个值按以下顺序来自对称矩阵:

[[11, 12, 13], [12, 22, 23], [13, 23, 33]] => (11, 22, 33, 12, 23, 31)

我想计算每个矩阵的特征值和特征向量。现在它是通过 2 个 for 循环迭代每个维度、将值重新排序为矩阵形式并计算特征值来实现的。但是我想知道是否有使用矢量化的更快的解决方案?

我发现的最佳方法是使用 (6,3,3) 变换矩阵将对称值转换为适当的对称张量。

transf = np.array([[[1.,0.,0.],[0.,0.,0.],[0.,0.,0.]],                #11
                   [[0.,0.,0.],[0.,1.,0.],[0.,0.,0.]],                #22
                   [[0.,0.,0.],[0.,0.,0.],[0.,0.,1.]],                #33
                   [[0.,1.,0.],[1.,0.,0.],[0.,0.,0.]],                #12 & 21
                   [[0.,0.,1.],[0.,0.,0.],[1.,0.,0.]],                #13 & 31
                   [[0.,0.,0.],[0.,0.,1.],[0.,1.,0.]]]).swapaxes(0,1) #23 & 32

e, v = np.linalg.eigh(input.dot(transf))

非编程注意:注意 abaqus 是输出真实的 stress/strain 还是工程 stress/strain,因为生成的转换是不同的(如果我没记错的话 for "real strain" 你需要非对角线项是 0.5 而不是 1.)