如何通过向量排列在一个平行步循环,没有提前生成所有排列吗?

4视图(30天)
我需要一个paralleised循环遍历所有的排列1:N
虽然对于某些N的值在计算上是可行的,N可能太大预先执行所有排列,然后通过在一个简单的步骤 parfor 循环。它占用太多的内存。一个工人一个简单的解决方案是用类似 p = nextperm (p) ,下一个排列在lexigoraphic秩序。但并行执行它我需要一个互斥资源,类似 p = mutexNextPerm (), 返回下一个排列没有处理任何工人。只有一个副本的函数必须存在为所有员工;这个函数 mutexNextPerm () 然后可以调用 p = nextperm (p) 和跟踪 p 服务。
这是在MATLAB完成吗?
2的评论
什洛莫Geva
什洛莫Geva 2022年10月15日
谢谢你大卫,
parfor问题是会有私人的副本mutexNextperm()——一个在每个工作线程;除非我误解了它是如何工作的。持续的变量是行不通的。每个副本都有它自己的持久性变量p。
parfor只金宝app支持一组有限的减少(如最大值、最小值、联盟、相交和其他一些)。
我基本上找监狱打破…也许SPMD或者别的什么?

登录置评。

接受的答案

布鲁诺陈德良
布鲁诺陈德良 2022年10月15日
编辑:布鲁诺陈德良 2022年10月15日
函数 getenumperm 风箱列举的排列1:n
n = 4;
k = 1:阶乘(n)%或parfor
p = getenumperm (k, n)
做一些与p
结束
p = 1×4
1 2 3 4
p = 1×4
1 2 3 4
p = 1×4
1 2 3 4
p = 1×4
1 2 3 4
p = 1×4
1 2 3 4
p = 1×4
1 4 3 2
p = 1×4
1 2 3 4
p = 1×4
2 4 1 3
p = 1×4
1 2 3 4
p = 1×4
1 2 3 4
p = 1×4
3 1 4 2
p = 1×4
4 1 3 2
p = 1×4
1 2 3 4
p = 1×4
2 4 1 3
p = 1×4
3 2 1 4
p = 1×4
4 2 1 3
p = 1×4
3 4 1 2
p = 1×4
4 3 1 2
p = 1×4
1 2 3 4
p = 1×4
1 2 3 4
p = 1×4
3 2 4 1
p = 1×4
4 2 3 1
p = 1×4
1 2 3 4
p = 1×4
4 3 2 1
函数p = getenumperm (k, n)
%得到枚举数k的排列
p = 0 (1, n);
我= 1:n;
f =阶乘(n - 1);
j = n: 1:1
r =装天花板(k / f);
k =国防部(k - 1 f) + 1;
p(我(r)) = n-j + 1;
我= ([1:r 1 r + 1: n r]);
f = f / (j - 1);
结束
结束

更多的答案(0)

类别

找到更多的在循环和条件语句帮助中心文件交换

下载188bet金宝搏


释放

R2020b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!