- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于我正在制作的程序,我想实现我自己的矩阵 vector 乘法算法。这是它的代码。
static <T extends List<Double>> List<Double> matrixVectorMulti(List<T> matrix, List<Double> vector) {
List<Double> output = new ArrayList<>();
for(int row = 0; row < matrix.size(); row++) {
double sum = 0;
for (int column = 0; column < vector.size(); column++) {
sum += matrix.get(row).get(column) * vector.get(column);
}
output.add(sum);
}
return output;
}
是否可以使用多线程来提高算法的性能,或者我的算法是否更有效。另外,如果您能为我提供多线程实现的示例代码,将会很有帮助。
注意:列表的列表用于对矩阵建模,列表用于对 vector 建模。
最佳答案
多线程是否会提高性能实际上取决于许多因素
矩阵中有多少数据
您的用例是 CPU 密集型(IO 最少的乘法)。假设矩阵
很大,您可以通过实现多线程获得一定程度的好处。
下面是多线程的一种版本,它可以利用并行处理(线程数量几乎等于可用于处理的处理器数量)。
请记住,还有其他方法可以提高性能...例如使用矩阵大小初始化输出
ArrayList 等。
注意:下面计算的性能统计数据不是科学方法......它只是一种非正式的计算方法。该代码未经过充分测试。但它可以给你这个想法。
package my.package;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class MatrixMultiplication {
public List<Double> matrixVectorMulti(List<List<Double>> matrix, List<Double> vector) {
List<Double> output = new ArrayList<>();
for(int row = 0; row < matrix.size(); row++) {
double sum = 0;
for (int column = 0; column < vector.size(); column++) {
sum += matrix.get(row).get(column) * vector.get(column);
}
output.add(sum);
}
return output;
}
static List<List<Double>> initializeMatrix(int matrix_size) {
List<List<Double>> matrix = new ArrayList<>();
int rangeMin = 100;
int rangeMax = 200;
for (int i=0; i<matrix_size; i++) {
List<Double> row = new ArrayList<>();
for (int j=0; j<matrix_size; j++) {
row.add(rangeMin + (rangeMax-rangeMin) * new Random().nextDouble());
}
matrix.add(row);
}
return matrix;
}
static List<Double> initializeVector(int matrix_size) {
List<Double> vector = new ArrayList<>();
int rangeMin = 100;
int rangeMax = 200;
for (int j=0; j<matrix_size; j++) {
vector.add(rangeMin + (rangeMax-rangeMin) * new Random().nextDouble());
}
return vector;
}
public List<Double> matrixVectorMultiParallel(List<List<Double>> matrix, List<Double> vector) {
int numOfThreads = Runtime.getRuntime().availableProcessors();
List<Double> result = new ArrayList<>();
//System.out.println(numOfThreads);
//System.exit(0);
int batchSize = matrix.size()/numOfThreads;
PartialVectorMulti[] partialVectorMultis = new PartialVectorMulti[numOfThreads];
int rangeStart = 0;
int rangeEnd = 0;
for (int i=0; i<numOfThreads; i++) {
rangeEnd = rangeStart + batchSize-1;
if (i == numOfThreads-1) {
partialVectorMultis[i] = new PartialVectorMulti(matrix, rangeStart, matrix.size()-1, vector);
} else {
partialVectorMultis[i] = new PartialVectorMulti(matrix, rangeStart, rangeEnd, vector);
}
partialVectorMultis[i].start();
rangeStart = rangeEnd + 1;
}
for (int i=0; i<numOfThreads; i++) {
try {
partialVectorMultis[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i=0; i<numOfThreads; i++) {
result.addAll(partialVectorMultis[i].getPartialResult());
}
return result;
}
public static void main(String[] args) {
int matrix_size = 10_000;
List<List<Double>> matrix = initializeMatrix(matrix_size);
List<Double> vector = initializeVector(matrix_size);
List<Double> result;
List<Double> resultMulti;
MatrixMultiplication matrixMultiplication = new MatrixMultiplication();
long startTime = System.currentTimeMillis();
result = matrixMultiplication.matrixVectorMulti(matrix, vector);
long endTime = System.currentTimeMillis();
System.out.println("matrixVectorMulti: " + (endTime-startTime) + "milli seconds");
startTime = System.currentTimeMillis();
resultMulti = matrixMultiplication.matrixVectorMultiParallel(matrix, vector);
endTime = System.currentTimeMillis();
System.out.println("matrixVectorMultiParallel: " + (endTime-startTime) + "milli seconds");
}
class PartialVectorMulti extends Thread {
List<List<Double>> matrix;
List<Double> vector;
int rowStart;
int rowEnd;
List<Double> partialResult = new ArrayList<>();
public PartialVectorMulti(List<List<Double>> matrix, int rowStart, int rowEnd, List<Double> vector) {
this.matrix = matrix;
this.rowStart = rowStart;
this.rowEnd = rowEnd;
this.vector = vector;
}
public List<Double> getPartialResult() {
return this.partialResult;
}
@Override
public void run() {
for (int i=rowStart; i<=rowEnd; i++) {
double sum = 0;
for (int j=0; j<vector.size(); j++) {
sum += matrix.get(i).get(j) * vector.get(j);
}
partialResult.add(sum);
}
}
}
}
关于java - 可以使用多线程来使这个矩阵 vector 乘法算法更加高效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58089171/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我正在寻找清理 Grails Controller 代码的方法。在各种 Controller 中我或多或少有相同的逻辑.. 获取对象 检查是否存在 等等.. 是否有建议的方法可以使 Controlle
我真的很喜欢 PHP,因为: _ 易于开发 Web 应用程序(您可以在 10 分钟内设置 LAMP,然后就可以开始了) _ 简单易学 _ 易于部署(您只需要带有 PHP 模块的 Apache) 我真的
我正在尝试使用 mod_rewrite 将我的博客 URL 转换为更适合 SEO 的格式。我所有的文章都存储在一个简单的 MySQL 数据库中。每个博客文章的网址如下所示: http://www.te
我是一名优秀的程序员,十分优秀!