如何使用流将2 double [] []矩阵相乘? [英] How to multiply 2 double[][] matrices using streams?
问题描述
我想知道使用流对多个2个double[][]
数组矩阵进行最紧凑,最有效的方式是什么.该方法应遵循矩阵乘法规则,如下所示:
I'm wondering what the most compact and efficient way to multiple 2 double[][]
arrays matrices using streams. The approach should follow matrix multiplication rules as illustrated here:
这是使用for循环(this
是第一个矩阵)的一种方法:
Here's one way to do it using for loops (this
is the first matrix):
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;
}
}
该程序应适合以下测试数据:
The procedure should fit the following test data:
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[][]
.
A more compact and readable solution is to create a Stream over the rows of the first matrix, map each row to the result of multiplying it with the second matrix column and collect that back into a 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
中.对于每一行的乘法,我们无法使用 IntStream
在索引上.
This will calculate m1 * m2
and the result will be in result
. For the multiplication of each row, we can't create a Stream with Arrays.stream
of the second matrix since this would create a Stream over the rows when we need a Stream over the columns. To counteract that, we simply go back to using an IntStream
over the indexes.
这篇关于如何使用流将2 double [] []矩阵相乘?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!