Ole*_*Ole 2 java math java-8 java-stream
我想知道double[][]使用流的多个2 阵列矩阵最紧凑和有效的方法.该方法应遵循此处所示的矩阵乘法规则:http:
//www.mathwarehouse.com/algebra/matrix/multiply-matrix.php
这是使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
该程序应符合以下测试数据:
double[][] md1 = { { 4d, 8d }, { 0d, 2d }, { 1d, 6d } };
double[][] md2 = { { 5d, 2d, 5d, 5d }, { 9d, 4d, 5d, 5d } };
double[][] md1 = { { 4d, 8d }, { 0d, 2d }, { 1d, 6d } };
double[][] md2 = { { 5d }, { 9d } };
Run Code Online (Sandbox Code Playgroud)
更紧凑和可读的解决方案是在第一个矩阵的行上创建Stream,将每行映射到将其与第二个矩阵列相乘的结果,并将其收集回到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));
}
Run Code Online (Sandbox Code Playgroud)
这将计算m1 * m2,结果将在result.对于每一行的乘法,我们不能用Arrays.stream第二个矩阵创建一个Stream,因为当我们在列上需要Stream时,这会在行上创建一个Stream.为了抵消这种情况,我们只需回过头来使用IntStream索引.