使用Java 8的功能,這是我如何去做的,我迭代了行並對它進行了並行操作。我沒有找到任何標準方法,需要一個
double [] []
,並把它作爲一個流或
parallelSetAll(double [] [] ...)
我的代碼,我使用Apache的commons-數學庫爲我的矩陣實現,因爲它提供基於庫中實現的RealMatrix類型的實用函數
這個代碼可以被進一步優化,而不必過多地執行級別。喜歡拿出for循環或稍後做任務,等等。
public static RealMatrix clipLower(RealMatrix m, double lowerBound){
// TODO see if you really need to modify m or just return a modified copy of m
//process the matrix row by row, each row gets processed in parallel
// TODO See if you can directly parallelize on the entire matrix not row by row
// OPEN implement using Arrays.parallelSetAll Method?
int nrOfRows = m.getRowDimension();
for(int i = 0; i < nrOfRows; i++){
// TODO move the declaration outside the for loop
double[] currRow = m.getRow(i);
double[] newRow = Arrays.stream(currRow)
.parallel()
.map((number) -> (number < lowerBound) ? lowerBound : number)
.toArray();
m.setRow(i, newRow);
}
return m;
}
對於Java 8,您可能需要查看Arrays.parallelSetAll。例如:'Arrays.parallelSetAll(arr,i - > arr [i]> 5?5:arr [i]);' –
..否則您可以創建自己的方法。將數組分成相等的塊大小,然後在每個塊上應用該操作(由獨立線程處理的塊)。由於你的要求是無狀態的,這不應該很難實現。 –
在同一陣列或5000個不同陣列上5000次? (如果它是5000個不同的數組,它可能(!)將這些操作放入一個'ExecutorService'中更有效率,每個數組對應一個)。否則:它會一直是二維數組嗎?它會一直是'int'數組嗎?所有這些都會影響這項任務的適當「基礎設施」會是什麼樣子...... – Marco13