簡體   English   中英

在 Java 中計算大型數據集的主軸/特征值和-向量

[英]Calculating the principal axis/eigenvalues and -vectors of large dataset in Java

我有一個大型數據集(>500.000 個元素),其中包含 FEM 元素的應力值(σ_xx、σ_yy、σ_zz、τ_xy、τ_yz、τ_xz)。 這些應力值在 model 的全局 xyz 坐標空間中給出。我想從中計算主軸應力值和方向。 如果您不太熟悉其背后的物理原理,這意味着采用對稱矩陣

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

並計算其特征值和特征向量。 單獨計算每組特征值和 -vectors 太慢了。 我正在 Java 中尋找一個庫、一種算法或其他東西,它們可以讓我將此作為數組計算來執行。 例如,在 python/numpy 中,我可以將我所有的 3x3 矩陣,沿三維堆疊它們以獲得 nx3x3 數組,並將其傳遞給 np.linalg.eig(arr),它會自動給我一個三個特征值的 nx3 數組和三個特征向量的 nx3x3 數組。

我嘗試過的事情:

  • nd4j 有一個用於計算特征值和特征向量的特征模塊,但一次只支持一個方形數組。
  • 計算特征多項式並使用 cardanos 公式獲取根/特征值 - 可以一次對整個數組執行此操作,但我現在被困在如何獲取相應的特征向量上。 是否有從這些到特征向量的通用簡單算法?
  • 尋找可以直接計算的特征值和-向量的分析形式:它確實存在,但沒有。

您需要編寫一些代碼。

我將創建或使用Matrix class 作為依賴項,並找到為您提供特征值和特征向量的方法。 您在nd4j中找到的那些聽起來很不錯。 您還可以考慮Linear Algebra For Java (LA4J) 依賴項。

將數據集加載到List<Matrix>中。

使用功能 Java 方法應用 map 為您提供特征值List作為每個應力矩陣的向量和特征向量List作為每個應力矩陣的矩陣。

您可以通過將 map function 應用到 stream 來最大程度地優化此計算。Java 將在幕后並行計算以最大程度地利用可用內核。

后續:這是最適合我的方式,因為我可以在不遍歷每個元素的情況下完成所有操作。 如上所述,我使用的是 Nd4j,與 numpy 相比,它的可能性似乎有限(或者我可能只是沒有充分閱讀文檔)。 以下方法僅使用基本數組操作:

  1. 根據給定的壓力值,使用 Cardano 公式計算特征值。 只需要元素明智的指令來做到這一點(add、sub、mul、div、pow)。 結果應該是三個大小為 n 的向量,每個向量包含所有元素的一個特征值。

  2. 使用此處給出的公式計算每個特征值的矩陣 S。 與步驟 1 一樣,這顯然也可以僅使用具有應力值和特征值向量的逐元素操作來完成,以避免指定一些復雜的指令,說明根據哪個軸乘以哪個數組,同時保持任何其他軸。

  3. 從 S 中取出一列並將其歸一化以獲得給定特征值的歸一化特征向量。

請注意,此方法僅在您具有實數對稱矩陣時才有效。 您還應該確保正確處理相同特征值多次出現的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM