在Java中计算大型数据集的主轴/特征值和向量



我有一个大型数据集(>500000个元素(,其中包含FEM元素的应力值(σ_xx、σ_yy、σ_zz、τ_xy、τ_yz、τ_xz(。这些应力值在模型的全局xyz坐标空间中给出。我想计算主轴的应力值和方向。如果你不太熟悉它背后的物理原理,这意味着要使用对称矩阵

| σ_xx τ_xy τ_xz |
| τ_xy σ_yy τ_yz |
| τ_xz τ_yz σ_zz |

并计算其特征值和特征向量。单独计算每组特征值和向量太慢了。我正在寻找一个库,一个算法或Java中的东西,它可以让我作为数组计算来完成这项工作。举个例子,在python/numpy中,我只需要取我所有的3x3矩阵,将它们沿着第三维度堆叠,就可以得到一个nx3x3数组,并将其传递给np.linalg.eig(arr(,它会自动为我提供三个特征值的nx3数组和三个特征向量的nx30数组。

我尝试过的东西:

  • nd4j有一个用于计算特征值和-向量的特征值模块,但一次只支持单个方阵
  • 计算特征多项式,并使用cardanos公式来获得根/特征值-可以同时对整个数组进行计算,但我现在不知道如何获得相应的特征向量。有没有一个通用的简单算法可以从这些算法中得到特征向量
  • 寻找一种可以直接计算的特征值和向量的分析形式:它确实存在,但只是不存在

您需要编写一些代码。

我会创建或使用Matrix类作为依赖项,并找到方法来提供特征值和特征向量。你在nd4j中找到的那些听起来像是很棒的候选者。您还可以考虑Java的线性代数(LA4J(依赖关系。

将数据集加载到List<Matrix>中。

使用函数Java方法应用映射,将特征值的List作为每个应力矩阵的向量,将特征向量的List作为每个应力矩阵的矩阵。

通过将map函数应用于流,可以最大限度地优化此计算。Java将在幕后并行化计算,以最大限度地利用可用的核心。

后续:这是最适合我的方式,因为我可以在不迭代每个元素的情况下完成所有操作。如上所述,我使用的是Nd4j,与numpy相比,它的可能性似乎有限(或者可能我只是没有充分阅读文档(。以下方法只使用基本的数组操作:

  1. 根据给定的应力值,使用Cardano公式计算本征值。只需要元素指令(add、sub、mul、div、pow(。结果应该是三个大小为n的向量,每个向量包含所有元素的一个特征值。

  2. 使用这里给出的公式来计算每个特征值的矩阵S。与步骤1一样,这显然也可以只使用应力值和特征值向量的元素运算来完成,以避免指定一些复杂的指令,根据哪个轴对哪个数组进行乘法,同时保留任何其他轴。

  3. 从S中取一列,并对其进行归一化,以获得给定特征值的归一化特征向量。

请注意,此方法仅在具有实对称矩阵的情况下有效。您还应该确保正确处理同一特征值多次出现的情况。

最新更新