[英]Stream to populate 2D array of doubles
我有以下循環,我想將其轉換為並行流。 請注意, mbbVariance
和nbbVariance
都返回double
。
double[][] outMBB = new double[rows][maxBlockSize];
double[][] outNBB = new double[rows][maxBlockSize];
for (int j = 0; j < rows; j++) {
for (int m = 0; m < maxBlockSize; m++) {
outMBB[j][m] = mbbVariance(timeSeries[j], m + 1, alpha);
outNBB[j][m] = nbbVariance(timeSeries[j], m + 1, alpha);
}
}
我最好的嘗試是
double[][] outMBB = IntStream.range(0, rows)
.parallel()
.mapToDouble(j -> (
IntStream.range(0, maxBlockSize)
.mapToDouble(m -> mbbVariance(timeSeries[j], m + 1, alpha))
.toArray(double[]::new)
)
)
.toArray(double[][]::new);
double[][] outNBB = IntStream.range(0, rows)
.parallel()
.mapToDouble(j -> (
IntStream.range(0, maxBlockSize)
.mapToDouble(m -> nbbVariance(timeSeries[j], m + 1, alpha))
.toArray(double[]::new)
)
)
.toArray(double[][]::new);
但這不起作用。
我真的不是流的專業人士,這個解決方案更像是一個起點,而不是一個完美的產品。
double[][] outMBB = new double[rows][maxBlockSize];
double[][] outNBB = new double[rows][maxBlockSize];
IntStream.range(0, rows).forEach(i -> IntStream.range(0, maxBlockSize).forEach(
m -> { outFSMBB[j][m] = mbbVariance(timeSeries[j], m + 1, alpha);
outFSNBB[j][m] = nbbVariance(timeSeries[j], m + 1, alpha);
}));
這個解決方案更多的是模擬你用循環所做的事情,而不是真正利用流的能力。
你的第一次嘗試真的很接近。
int rows = 4;
int columns = 5;
double[][] outNBB = IntStream.range(0, rows).mapToObj(
j -> IntStream.range(0, columns).mapToDouble(
m -> Math.random()
).toArray()
).toArray(double[][]::new);
您幾乎只需要mapToObj
而不是mapToDouble
因為 double[][] 實際上是一個對象數組,其中每個對象都是一個 double[]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.