Поток для заполнения 2D-массива двойников - PullRequest
1 голос
/ 02 апреля 2020

У меня есть следующее l oop, которое я хотел бы преобразовать в параллельный поток. Обратите внимание, что 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);

, но это не работает.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Я действительно не профессионал с потоками, это решение - скорее отправная точка, чем отполированный продукт.

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);
        }));

Это решение - скорее симуляция того, что вы сделали с циклами, чем реальное использование того, на что способны потоки.

1 голос
/ 02 апреля 2020

Вы были действительно близки с первой попыткой.

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 [] [] на самом деле представляет собой массив объектов, где каждый объект двойной [].

...