[英]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 數組。
我嘗試過的事情:
您需要編寫一些代碼。
我將創建或使用Matrix
class 作為依賴項,並找到為您提供特征值和特征向量的方法。 您在nd4j
中找到的那些聽起來很不錯。 您還可以考慮Linear Algebra For Java (LA4J) 依賴項。
將數據集加載到List<Matrix>
中。
使用功能 Java 方法應用 map 為您提供特征值List
作為每個應力矩陣的向量和特征向量List
作為每個應力矩陣的矩陣。
您可以通過將 map function 應用到 stream 來最大程度地優化此計算。Java 將在幕后並行計算以最大程度地利用可用內核。
后續:這是最適合我的方式,因為我可以在不遍歷每個元素的情況下完成所有操作。 如上所述,我使用的是 Nd4j,與 numpy 相比,它的可能性似乎有限(或者我可能只是沒有充分閱讀文檔)。 以下方法僅使用基本數組操作:
根據給定的壓力值,使用 Cardano 公式計算特征值。 只需要元素明智的指令來做到這一點(add、sub、mul、div、pow)。 結果應該是三個大小為 n 的向量,每個向量包含所有元素的一個特征值。
使用此處給出的公式計算每個特征值的矩陣 S。 與步驟 1 一樣,這顯然也可以僅使用具有應力值和特征值向量的逐元素操作來完成,以避免指定一些復雜的指令,說明根據哪個軸乘以哪個數組,同時保持任何其他軸。
從 S 中取出一列並將其歸一化以獲得給定特征值的歸一化特征向量。
請注意,此方法僅在您具有實數對稱矩陣時才有效。 您還應該確保正確處理相同特征值多次出現的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.