当前位置:  开发笔记 > 编程语言 > 正文

Java 8矩阵*向量乘法

如何解决《Java8矩阵*向量乘法》经验,为你挑选了1个好方法。

我想知道在Java 8中使用流来执行以下操作是否有更简洁的方法:

public static double[] multiply(double[][] matrix, double[] vector) {
    int rows = matrix.length;
    int columns = matrix[0].length;

    double[] result = new double[rows];

    for (int row = 0; row < rows; row++) {
        double sum = 0;
        for (int column = 0; column < columns; column++) {
            sum += matrix[row][column]
                    * vector[column];
        }
        result[row] = sum;
    }
    return result;
}

编辑.我收到了一个非常好的答案,但是性能比旧的实现慢了大约10倍,所以我在这里添加测试代码以防有人想要调查它:

@Test
public void profile() {
    long start;
    long stop;
    int tenmillion = 10000000;
    double[] vector = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    double[][] matrix = new double[tenmillion][10];

    for (int i = 0; i < tenmillion; i++) {
        matrix[i] = vector.clone();
    }
    start = System.currentTimeMillis();
    multiply(matrix, vector);
    stop = System.currentTimeMillis();
 }

Tunaki.. 7

使用Stream的直接方法如下:

public static double[] multiply(double[][] matrix, double[] vector) {
    return Arrays.stream(matrix)
                 .mapToDouble(row -> 
                    IntStream.range(0, row.length)
                             .mapToDouble(col -> row[col] * vector[col])
                             .sum()
                 ).toArray();
}

这将创建matrix(Stream)的每一行的Stream ,然后将每一行映射到使用vector数组计算产品的double值.

我们必须在索引上使用Stream来计算产品,因为遗憾的是没有内置工具可以将两个Streot压缩在一起.



1> Tunaki..:

使用Stream的直接方法如下:

public static double[] multiply(double[][] matrix, double[] vector) {
    return Arrays.stream(matrix)
                 .mapToDouble(row -> 
                    IntStream.range(0, row.length)
                             .mapToDouble(col -> row[col] * vector[col])
                             .sum()
                 ).toArray();
}

这将创建matrix(Stream)的每一行的Stream ,然后将每一行映射到使用vector数组计算产品的double值.

我们必须在索引上使用Stream来计算产品,因为遗憾的是没有内置工具可以将两个Streot压缩在一起.


嗨Tunaki - 谢谢 - 这有效!虽然我对表现感到有些惊讶.对于一个有1000万行的矩阵,它需要10倍的时间才能完成......所以我想我会坚持使用'旧'循环.谢谢.
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有