gpt4 book ai didi

java - 如何使用流将 2 个 double[][] 矩阵相乘?

转载 作者:行者123 更新时间:2023-12-02 14:45:19 26 4
gpt4 key购买 nike

我想知道多重 2 double[][] 最紧凑、最有效的方法是什么使用流的数组矩阵。该方法应遵循矩阵乘法规则,如下所示:

Matrix Multiplication: How to Multiply Two Matrices Together

这是使用 for 循环执行此操作的一种方法( this 是第一个矩阵):

final int nRows = this.getRowDimension();
final int nCols = m.getColumnDimension();
final int nSum = this.getColumnDimension();

final double[][] outData = new double[nRows][nCols];
// Will hold a column of "m".
final double[] mCol = new double[nSum];
final double[][] mData = m.data;

// Multiply.
for (int col = 0; col < nCols; col++) {
// Copy all elements of column "col" of "m" so that
// will be in contiguous memory.
for (int mRow = 0; mRow < nSum; mRow++) {
mCol[mRow] = mData[mRow][col];
}

for (int row = 0; row < nRows; row++) {
final double[] dataRow = data[row];
double sum = 0;
for (int i = 0; i < nSum; i++) {
sum += dataRow[i] * mCol[i];
}
outData[row][col] = sum;
}
}

该过程应符合以下测试数据:

double[][] md1 = {{4d, 8d}, {0d, 2d}, {1d, 6d}};
double[][] md2 = {{5d, 2d, 5d, 5d}, {9d, 4d, 5d, 5d}};

double[][] mb1 = {{4d, 8d}, {0d, 2d}, {1d, 6d}};
double[][] mb2 = {{5d}, {9d}};

最佳答案

更紧凑和可读的解决方案是在第一个矩阵的行上创建一个 Stream,将每一行映射到与第二个矩阵列相乘的结果,并将其收集回 double[][] .

public static void main(String[] args) {
double[][] m1 = {{4, 8}, {0, 2}, {1, 6}};
double[][] m2 = {{5, 2}, {9, 4}};

double[][] result = Arrays.stream(m1)
.map(r -> IntStream.range(0, m2[0].length)
.mapToDouble(i -> IntStream.range(0, m2.length)
.mapToDouble(j -> r[j] * m2[j][i]).sum())
.toArray())
.toArray(double[][]::new);

System.out.println(Arrays.deepToString(result));
// [[92.0, 40.0], [18.0, 8.0], [59.0, 26.0]]
}

这将计算 m1 * m2结果将在 result 中。对于每一行的乘法,我们无法使用 Arrays.stream 创建一个Stream第二个矩阵的,因为当我们需要列上的流时,这会在行上创建一个流。为了解决这个问题,我们只需返回使用 IntStream 超过索引。

关于java - 如何使用流将 2 个 double[][] 矩阵相乘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34774384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com