第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何使用Stream Parallel Java進(jìn)行矩陣計(jì)算?

如何使用Stream Parallel Java進(jìn)行矩陣計(jì)算?

哈士奇WWW 2024-01-05 16:47:52
我正在嘗試使用多維數(shù)組([verybigrow][2])創(chuàng)建矩陣算術(shù)運(yùn)算方法。我是新手,我只是找不到我做錯(cuò)了什么。如果有人幫助我告訴我它是什么,我真的很感激。    try {        Stream<String> Matrix = Files.lines(Paths.get(file)).parallel();        String[][] DataSet = Matrix.map(mapping -> mapping.split(",")).toArray(String[][]::new);        Double[][] distanceTable = new Double[DataSet.length - 1][];        /* START WANT TO REPLACE THIS MATRIX CALCULATION WITH PARALLEL STREAM RATHER THAN USE TRADITIONAL ARRAY ARITHMETICS START  */        for (int i = 0; i < distanceTable.length - 1; ++i) {            distanceTable[i] = new Double[i + 1];            for (int j = 0; j <= i; ++j) {                double distance = 0.0;                for (int k = 0; k < DataSet[i + 1].length; ++k) {                    double difference = Double.parseDouble(DataSet[j][k]) - Double.parseDouble(DataSet[i + 1][k]);                    distance += difference * difference;                }                distanceTable[i][j] = distance;            }        }        /* END WANT TO REPLACE THIS MATRIX CALCULATION WITH PARALLEL STREAM RATHER THAN USE TRADITIONAL ARRAY ARITHMETICS START  */        } catch ( Exception except ){            System.out.println ( except );        }我寧愿不使用庫(kù)或類似的東西,我這樣做主要是為了了解它是如何工作的。預(yù)先非常感謝您。如果你詢問數(shù)據(jù)看起來像:4,535,6310,599,7713,49數(shù)據(jù)處理的輸出應(yīng)如下所示:[101] <- ((4-5)^2) + ((53-63)^2)[72, 41] <- ( ((4-10)^2) + ((53-59)^2) ), ( ((5,10)^2) + ((63-59)^2))[601.0, 212.0, 325.0][97.0, 260.0, 109.0, 800.0][337.0, 100.0, 109.0, 80.0, 400.0]
查看完整描述

2 回答

?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

我嘗試matrixDistance用 來改變distanceTable。嘗試將此代碼移至不同的方法中,以便可以并行運(yùn)行它


        for(int i = 0; i < matrixDistance.length - 1; ++i) {

            distanceTable[i] = new double[i + 1];

            for(int j = 0; j <= i; ++j) {

                double distance = 0.0;

                for(int k = 0; k < DataSet[i+1].length; ++k) {

                    double difference = Double.parseDouble(DataSet[j][k]) - Double.parseDouble(DataSet[i+1][k]);

                    distance += difference * difference;

                }

                distanceTable[i][j] = distance;

            }

        }

我根據(jù)你的問題創(chuàng)建了這個(gè)例子。


    public void parallel(String file)

    ....

    // parsing from csv into matrix 2d Double[][]

    ....

        IntStream

            .range(1, data.length - 1)

            .parallel()

            .forEach(i -> {

                add(euclidian.euclidian(Arrays.copyOf(data, i+1)), i);

            });

}

這是你的算法的迷你版本。


    public Double[] euclidian(Double[][] data) {

        Double[] result = new Double[data.length - 1];

        for (int i = 0; i < result.length; i++) {

            result[i] =

                    Math.pow(data[i][0] - data[data.length - 1][0], 2) +

                            Math.pow(data[i][1] - data[data.length - 1][1], 2);

        }


        return result;

    }

并且由于并行執(zhí)行,您需要添加鎖定方法以將數(shù)據(jù)插入distanceTable。


    private final Object lock = new Object();

    Double[][] distanceTable;


    void add(Double[] data, int index){

        synchronized (lock) {

            distanceTable[index - 1] = data;

        }

    }

我已經(jīng)在我的筆記本電腦上測(cè)試了它,對(duì)于 csv 文件中的 74 行,比較如下(ORI 使用您的代碼,PAR 使用我的方法):


java -jar target/stream-example-1.0-SNAPSHOT.jar test.csv 

#####################

ORI read: 59 ms

ORI  map: 71 ms

ORI time: 80 ms

#####################

PAR read: 0 ms

PAR  map: 6 ms

PAR time: 11 ms

希望能幫助到你。


查看完整回答
反對(duì) 回復(fù) 2024-01-05
?
RISEBY

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊

例如,使用Double.parseDouble@Fahim Bagar 提供的代碼示例可以輕松消除浪費(fèi)String[][] DataSetDouble[][] DataSet


//String[][] DataSet = Matrix.map(mapping -> mapping.split(",")).toArray(String[][]::new);

Double[][] DataSet = Matrix.map(row -> Arrays.stream(row.split(",")).map(Double::parseDouble).toArray(Double[]::new)).toArray(Double[][]::new);

然后在循環(huán)之外獲取局部變量的DataSet[i + 1]各種數(shù)組引用:DataSet[j]


for (int i = 0; i < distanceTable.length - 1; ++i) {

    Double[] arriplus1 = new Double[i + 1];

    Double[] iarr = DataSet[i + 1];

    for (int j = 0; j <= i; ++j) {

        double distance = 0.0;

        Double[] jarr = DataSet[j];

        for (int k = 0, sz = iarr.length; k < sz; ++k) {

            double difference = jarr[k] - iarr[k];

            distance += difference * difference;

        }

        arriplus1[j] = distance;

    }

    distanceTable[i] = arriplus1;

}

您可以對(duì)@Fahim Bagareuclidian方法做同樣的事情


public Double[] euclidian(Double[][] data) {

    Double[] result = new Double[data.length - 1];

    Double[] dL1 = data[data.length - 1];

    for (int i = 0; i < result.length; i++) {

        Double[] di = data[i];

        result[i] = Math.pow(di[0] - dL1[0], 2) + Math.pow(di[1] - dL1[1], 2);

    }

    return result;

}

之后,擺脫Double并使用double將進(jìn)一步加快/減少內(nèi)存分配。


在 CSV 第 1048 行中,我在每次運(yùn)行第 10 次時(shí)看到這些計(jì)時(shí):


#####################

ORI read: 0 ms

ORI  map: 4 ms

ORI time: 14 ms

#####################

PAR read: 0 ms

PAR  map: 1 ms

PAR time: 10 ms


查看完整回答
反對(duì) 回復(fù) 2024-01-05
  • 2 回答
  • 0 關(guān)注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)