【发布时间】:2019-01-04 22:37:10
【问题描述】:
我编写了不同的代码来产生不同的排列组合。它们适用于小尺寸的矩阵:
例如:
S=[-1 -1 1 1 1 1 1 1];
P=unique(perms(S),'rows');
产生:
-1 -1 1 1 1 1 1 1
-1 1 -1 1 1 1 1 1
-1 1 1 -1 1 1 1 1
-1 1 1 1 -1 1 1 1
-1 1 1 1 1 -1 1 1
-1 1 1 1 1 1 -1 1
-1 1 1 1 1 1 1 -1
1 -1 -1 1 1 1 1 1
1 -1 1 -1 1 1 1 1
1 -1 1 1 -1 1 1 1
1 -1 1 1 1 -1 1 1
1 -1 1 1 1 1 -1 1
1 -1 1 1 1 1 1 -1
1 1 -1 -1 1 1 1 1
1 1 -1 1 -1 1 1 1
1 1 -1 1 1 -1 1 1
1 1 -1 1 1 1 -1 1
1 1 -1 1 1 1 1 -1
1 1 1 -1 -1 1 1 1
1 1 1 -1 1 -1 1 1
1 1 1 -1 1 1 -1 1
1 1 1 -1 1 1 1 -1
1 1 1 1 -1 -1 1 1
1 1 1 1 -1 1 -1 1
1 1 1 1 -1 1 1 -1
1 1 1 1 1 -1 -1 1
1 1 1 1 1 -1 1 -1
1 1 1 1 1 1 -1 -1
或
indices = nchoosek(1:41, 6);
N = size(indices, 1);
S = ones(N, 41);
S(sub2ind([N 41], [1:N 1:N 1:N 1:N 1:N 1:N].', indices(:))) = -1;
可以生产 6 减一(-1)和 35 一(1)的所有排列的 4496388_by_41 矩阵。
这些代码适用于较小尺寸的矩阵,但不适用于较大尺寸的矩阵。
我的目标是产生 20 减一 (-1) 和 21 一 (1) 的所有排列,这个矩阵有 269128937220 行和 41 列。但以下代码不起作用:
indices = nchoosek(1:41, 20);
N = size(indices, 1);
S = ones(N, 41);
S(sub2ind([N 41], [1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N].', indices(:))) = -1;
或
S=[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
P=unique(perms(S),'rows');
我对每个排列(这个矩阵的每一行)做一个简单的计算。如果我可以用 for 循环编写该矩阵的每一行,然后对该行进行计算,我将能够保持最佳结果,在这种情况下,我不必将所有这些数据保存在内存中,我会'不要从 matlab 中得到内存错误。
如果您知道如何使用 for 循环或任何其他方式将它们存储在我的计算机中,请帮助生成一个包含 20 减一 (-1) 和 21 一 (1) 的所有排列的矩阵。
提前致谢
【问题讨论】:
-
您已确定有 269128937220 个组合。你打算用这些做什么?假设您每秒可以评估 1000 个组合:
269128937220 / 1000 / 60 / 60 / 24 = 3114.9天!您确定需要检查所有可能的组合吗?我觉得这不是您要解决的任何问题的正确方法... -
269128937220 行和 41 列。这意味着 80 TB 的内存。你有吗?
-
@SardarUsama 让我们清楚,80TB 的 RAM!甚至没有ROM!请 ehsun,花点时间看看这是多么荒谬。
-
@CrisLuengo,不一定是 3000 天……我们只需要几个小时!
标签: matlab performance matrix combinations permutation