我尝试使用Java 8编写当前代码。昨天我找到了下一个source的线性代数示例。在矩阵向量乘法的基础上(链接中的最后一个例子),我编写了我的所有者方法,用于矩阵的乘法。我的代码在这里:
import java.util.stream.IntStream;
public static void matrixMatrixProduct() {
System.out.println("Matrix matrix mulptiplication");
final int DIM1 = 15;
final int DIM2 = 20;
final int DIM3 = 2;
int[][] a = new int[DIM1][DIM2];
int[][] b = new int[DIM1][DIM3];
int[][] c = new int[DIM3][DIM2];
int counter = 1;
for (int i =0; i < DIM1; i++) {
for (int j =0; j < DIM3; j++) {
b[i][j] = counter++;
}
}
for (int i =0; i < DIM3; i++) {
for (int j =0; j < DIM2; j++) {
c[i][j] = counter++;
}
}
System.out.println("");
System.out.println("Print matrix b");
System.out.println("");
for (int i = 0; i < DIM1; i++) {
for (int j = 0; j < DIM3; j++) {
System.out.print(b[i][j] + " ");
}
System.out.print("\n");
}
System.out.println("");
System.out.println("Print matrix c");
System.out.println("");
for (int i = 0; i < DIM3; i++) {
for (int j = 0; j < DIM2; j++) {
System.out.print(c[i][j] + " ");
}
System.out.print("\n");
}
IntStream.range(0, DIM1)
.parallel()
.forEach( (i) -> {
IntStream.range(0, DIM2)
.sequential()
.forEach( (j) -> {
IntStream.range(0, DIM3)
.parallel()
.forEach( (k) -> {
a[i][j] += b[i][k]*c[k][j];
});
});
});
System.out.println("");
System.out.println("Print matrix a");
System.out.println("");
for (int i = 0; i < DIM1; i++) {
for (int j = 0; j < DIM2; j++) {
System.out.print(a[i][j] + " ");
}
System.out.print("\n");
}
我的问题是,通过调用parallel()
类,sequential()
和IntStream
方法之间的区别是什么? (实际上这是最重要的部分,我明确地进行乘法)。基于这些知识,我想知道,在上一次IntStream
调用中,正确的用法是什么。目前我在这个地方定义了方法parallel()
,但我不确定这是一个正确的解决方案......实际上,如果我将parallel()
更改为sequential()
我就不会# 39;看不出输出的差异。
答案 0 :(得分:1)
并行操作同时发生。这意味着可以同时处理流的元素。
顺序操作一次发生一次。
从sequential()
更改为parallel()
对结果没有影响,因为您的操作与状态无关,但可能会影响您的运行时间。但是,如果您执行的操作会影响将来的操作,那么您应该考虑使用sequential()
。
我认为你希望矩阵运算并行发生,但我对数学并不太熟悉。
链接到Javadoc,由@ the8472引用。