开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
Matrix2D.java 7.00 KB
一键复制 编辑 原始数据 按行查看 历史
Freeman 提交于 2020年11月19日 12:06 +08:00 . 完成30章练习
package lib;
import java.util.*;
import java.util.concurrent.*;
public class Matrix2D {
//生成随机矩阵
public static int[][] randomMatrix(int row, int col) {
if (row < 0 || col < 0)
throw new IllegalArgumentException("Number of rows or number of columns less than zero.");
if (row == 0 || col == 0) return null;
int[][] m = new int[row][col];
ForkJoinPool pool = new ForkJoinPool();
RandomMatrix2DTask masterTask = new RandomMatrix2DTask(m, 0, row, 0, col);
pool.invoke(masterTask);
return m;
}
//并行矩阵加法
public static long[][] parallelMatAdd(int[][] matA, int[][] matB) {
if (matA == null || matB == null) throw new NullPointerException();
if (matA.length != matB.length || matA[0].length != matB[0].length)
throw new IllegalArgumentException("Sizes of two matrices not equal.");
long[][] resultMat = new long[matA.length][matA[0].length];
ForkJoinPool pool = new ForkJoinPool();
MatrixAddTask masterTask = new MatrixAddTask(resultMat, matA, matB, 0, matA.length, 0, matA[0].length);
pool.invoke(masterTask);
return resultMat;
}
//并行矩阵乘法
public static double[][] parallelMatMul(int[][] matA, int[][] matB) {
if (matA == null || matB == null) throw new NullPointerException();
if (matA[0].length != matB.length)
throw new IllegalArgumentException("nCol of matrix A not equals to nRow of matrix B.");
double[][] resultMat = new double[matA.length][matB[0].length];
ForkJoinPool pool = new ForkJoinPool();
MatrixMulTask masterTask = new MatrixMulTask(resultMat, matA, matB, 0, resultMat.length, 0, resultMat[0].length);
pool.invoke(masterTask);
return resultMat;
}
}
//用于并行创建随机矩阵的任务类
class RandomMatrix2DTask extends RecursiveAction {
private final int[][] m;
private final int rowStart;
private final int colStart; //此任务对象处理矩阵的[rowStart,rowEnd-1]行,下同
private final int rowEnd;
private final int colEnd;
private static final int THRESHOLD = 20;
public RandomMatrix2DTask(int[][] m, int rowStart, int rowEnd, int colStart, int colEnd) {
this.m = m;
this.rowStart = rowStart;
this.rowEnd = rowEnd;
this.colStart = colStart;
this.colEnd = colEnd;
}
public void compute() {
//任务规模小,串行解决
int nRow = rowEnd - rowStart;
int nCol = colEnd - colStart;
if (nRow <= THRESHOLD || nCol <= THRESHOLD) {
Random r = new Random();
for (int i = rowStart; i <= rowEnd - 1; i++) {
for (int j = colStart; j <= colEnd - 1; j++) {
m[i][j] = r.nextInt();
}
}
return;
}
//拆分
int rowMid = (rowStart + rowEnd) / 2;
int colMid = (colStart + colEnd) / 2;
RandomMatrix2DTask branchTaskA = new RandomMatrix2DTask(m, rowStart, rowMid, colStart, colMid);
RandomMatrix2DTask branchTaskB = new RandomMatrix2DTask(m, rowStart, rowMid, colMid, colEnd);
RandomMatrix2DTask branchTaskC = new RandomMatrix2DTask(m, rowMid, rowEnd, colStart, colMid);
RandomMatrix2DTask branchTaskD = new RandomMatrix2DTask(m, rowMid, rowEnd, colMid, colEnd);
invokeAll(branchTaskA, branchTaskB, branchTaskC, branchTaskD);
}
}
//用于实现并行矩阵加法的任务类
class MatrixAddTask extends RecursiveAction {
private final int[][] matA;
private final int[][] matB;
private final long[][] resultMat;
private final int rowStart;
private final int colStart; //此任务对象处理矩阵的[rowStart,rowEnd-1]行,下同
private final int rowEnd;
private final int colEnd;
private static final int THRESHOLD = 20;
public MatrixAddTask(long[][] resultMat, int[][] matA, int[][] matB, int rowStart, int rowEnd, int colStart, int colEnd) {
this.resultMat = resultMat;
this.matA = matA;
this.matB = matB;
this.rowStart = rowStart;
this.rowEnd = rowEnd;
this.colStart = colStart;
this.colEnd = colEnd;
}
public void compute() {
if (rowEnd - rowStart <= THRESHOLD || colEnd - colStart <= THRESHOLD) {
for (int i = rowStart; i <= rowEnd - 1; i++) {
for (int j = colStart; j <= colEnd - 1; j++) {
resultMat[i][j] = matA[i][j] + matB[i][j];
}
}
return;
}
int rowMid = (rowStart + rowEnd) / 2;
int colMid = (colStart + colEnd) / 2;
MatrixAddTask branchA = new MatrixAddTask(resultMat, matA, matB, rowStart, rowMid, colStart, colMid);
MatrixAddTask branchB = new MatrixAddTask(resultMat, matA, matB, rowStart, rowMid, colMid, colEnd);
MatrixAddTask branchC = new MatrixAddTask(resultMat, matA, matB, rowMid, rowEnd, colStart, colMid);
MatrixAddTask branchD = new MatrixAddTask(resultMat, matA, matB, rowMid, rowEnd, colMid, colEnd);
invokeAll(branchA, branchB, branchC, branchD);
}
}
//用于实现并行矩阵乘法的任务类
class MatrixMulTask extends RecursiveAction {
private final int[][] matA;
private final int[][] matB;
private final double[][] resultMat;
private final int rowStart;
private final int colStart; //此任务对象处理矩阵的[rowStart,rowEnd-1]行,下同
private final int rowEnd;
private final int colEnd;
private static final int THRESHOLD = 5;
public MatrixMulTask(double[][] resultMat, int[][] matA, int[][] matB, int rowStart, int rowEnd, int colStart, int colEnd) {
this.resultMat = resultMat;
this.matA = matA;
this.matB = matB;
this.rowStart = rowStart;
this.rowEnd = rowEnd;
this.colStart = colStart;
this.colEnd = colEnd;
}
public void compute() {
if (rowEnd - rowStart <= THRESHOLD || colEnd - colStart <= THRESHOLD) {
for (int i = rowStart; i <= rowEnd - 1; i++) {
for (int j = colStart; j <= colEnd - 1; j++) {
//计算resultMat[i][j]
double sum = 0;
for (int k = 0; k <= matA[i].length - 1; k++) {
sum += matA[i][k] * matB[k][j];
}
resultMat[i][j] = sum;
}
}
return;
}
int rowMid = (rowStart + rowEnd) / 2;
int colMid = (colStart + colEnd) / 2;
MatrixMulTask branchA = new MatrixMulTask(resultMat, matA, matB, rowStart, rowMid, colStart, colMid);
MatrixMulTask branchB = new MatrixMulTask(resultMat, matA, matB, rowStart, rowMid, colMid, colEnd);
MatrixMulTask branchC = new MatrixMulTask(resultMat, matA, matB, rowMid, rowEnd, colStart, colMid);
MatrixMulTask branchD = new MatrixMulTask(resultMat, matA, matB, rowMid, rowEnd, colMid, colEnd);
invokeAll(branchA, branchB, branchC, branchD);
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

教材《Java语言程序设计(原书第10版)》(梁勇,机械工业出版社)上部分编程练习题的解答。
暂无标签
LGPL-2.1
使用 LGPL-2.1 开源许可协议
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/freeman449/Introduction-to-Java-Programming-Exercises.git
git@gitee.com:freeman449/Introduction-to-Java-Programming-Exercises.git
freeman449
Introduction-to-Java-Programming-Exercises
Java语言程序设计 编程练习
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /