我有一个递归的分治算法,在开始分割之前需要两个计算密集的基本案例任务.最初的基本案例是独立的任务,所以我想并行完成.在基本情况之后,除法运行相同的任务,在0和1之间输入不同的输入,并根据输出决定是否再次拆分.我通过创建一个伪造递归的任务包装器对象来使基本案例工作,但这感觉就像一个kludge,如下所示:
public static void doSomething () {
ForkJoinPool pool = new ForkJoinPool();
private ArrayList<Object> al = new ArrayList<Object>();
TaskWrapper tw = new TaskWrapper(true,-1);
al.addAll(pool.invoke(tw));
}
@SuppressWarnings("serial")
public static class TaskWrapper extends RecursiveTask<ArrayList<Object>> {
private ArrayList<Object> al = new ArrayList<Object>();
private boolean arg;
private double input;
private Object out;
TaskWrapper(boolean ar, double in){
arg = ar;
input = in;
}
@Override
public ArrayList<Object> compute() {
if (arg == false) {
out = new Object(runIntensiveTask(input));
al.add(out);
}
else {
// Right Base …Run Code Online (Sandbox Code Playgroud) java multithreading java.util.concurrent fork-join forkjoinpool
我有一个问题要在逻辑矩阵中标识和删除作为其他列子集的列。即[1,0,1]是[1,1,1]的子集;但是[1,1,0]和[0,1,1]都不是彼此的子集。我写了一段快速的代码来标识作为子集的列,并使用一对嵌套的for循环进行(n ^ 2-n)/ 2检查。
import numpy as np
A = np.array([[1, 0, 0, 0, 0, 1],
[0, 1, 1, 1, 1, 0],
[1, 0, 1, 0, 1, 1],
[1, 1, 0, 1, 0, 1],
[1, 1, 0, 1, 0, 0],
[1, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 0, 1, 0, 1, 0]])
rows,cols = A.shape
columns = [True]*cols
for i in range(cols):
for j in range(i+1,cols):
diff = A[:,i]-A[:,j]
if all(diff >= 0):
print …Run Code Online (Sandbox Code Playgroud) 给定一个nxn实数数组A,我试图找到2-d数组三行的所有组合的按元素最小值的最大值中的最小值。使用for循环,结果如下所示:
import numpy as np
n = 100
np.random.seed(2)
A = np.random.rand(n,n)
global_best = np.inf
for i in range(n-2):
for j in range(i+1, n-1):
for k in range(j+1, n):
# find the maximum of the element-wise minimum of the three vectors
local_best = np.amax(np.array([A[i,:], A[j,:], A[k,:]]).min(0))
# if local_best is lower than global_best, update global_best
if (local_best < global_best):
global_best = local_best
save_rows = [i, j, k]
print global_best, save_rows
Run Code Online (Sandbox Code Playgroud)
对于n = 100,输出应为:
Out[]: 0.492652949593 [6, 41, 58] …Run Code Online (Sandbox Code Playgroud) 我正在运行代码以生成B中位置的掩码,该掩码比D中的位置更接近A中的位置。
N = [[0 for j in range(length_B)] for i in range(length_A)]
dSquared = D*D
for i in range(length_A):
for j in range(length_B):
if ((A[j][0]-B[i][0])**2 + (A[j][1]-B[i][1])**2) <= dSquared:
N[i][j] = 1
Run Code Online (Sandbox Code Playgroud)
对于长度为数万个位置的A和B的列表,此代码需要一些时间。我很确定有办法矢量化它,但是可以使其运行得更快。谢谢。
我需要将一个稀疏逻辑矩阵转换为一组列表,其中每个list [i]都包含具有针对column [i]的非零值的行的集合。以下代码有效,但我想知道是否有更快的方法来执行此操作。我正在使用的实际数据约为6000x6000,并且比此示例稀疏得多。
import numpy as np
A = np.array([[1, 0, 0, 0, 0, 1],
[0, 1, 1, 1, 1, 0],
[1, 0, 1, 0, 1, 1],
[1, 1, 0, 1, 0, 1],
[1, 1, 0, 1, 0, 0],
[1, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 0, 1, 0, 1, 0]])
rows,cols = A.shape
C = np.nonzero(A)
D = [set() for j in range(cols)]
for i in range(len(C[0])):
D[C[1][i]].add(C[0][i])
print D
Run Code Online (Sandbox Code Playgroud)