matlab中1和0等概率的所有组合的二进制矩阵

Posted

技术标签:

【中文标题】matlab中1和0等概率的所有组合的二进制矩阵【英文标题】:binary matrix of all combination with equal probability of 1 and 0 in matlab 【发布时间】:2013-09-15 17:04:27 【问题描述】:

我想生成一个二进制矩阵,比如说 (8,1)。等概率表示矩阵中有四个 1 和四个 0。这些元素的不同排列总共有 70 种组合是可能的(例如 8C4)。我想要这些所有可能的组合一一。 请帮忙。

【问题讨论】:

【参考方案1】:

直截了当的答案是:

unique(perms([true(1, N / 2), false(1, N / 2)]), 'rows')

或以更奇特的形式:

unique(perms(sparse(1, 1:N / 2, true, 1, N)), 'rows')

其中N 是向量的长度(在您的示例中为N = 8)。但是,预计这种解决方案对于大型数组来说会非常慢。

令人惊讶的是,在这种情况下,一种更快的方法是生成所有可能的排列(请参阅here)并消除那些不满足所需标准的排列:

C = cell(N, 1);                 %// Preallocate memory
[C:] = ndgrid([true, false]); %// Generate N grids of binary values
p = cellfun(@(x)x(:), C);     %// Convert grids to column vectors
p = [p:];                     %// Obtain all combinations
p = p(sum(p, 2) == N / 2, :);   %// Keep only desired combinations

基准测试

N = 8;

%// Method #1 (one-liner)
tic
for k = 1:1e3
    p = unique(perms(sparse(1, 1:N / 2, true, 1, N)), 'rows');
end
toc

%// Method #2
tic
for k = 1:1e3
    C = cell(N, 1);
    [C:] = ndgrid([true, false]);
    p = cellfun(@(x)x(:), C);
    p = [p:];
    p = p(sum(p, 2) == N / 2, :);
end
toc

我得到的结果是:

Elapsed time is 0.858539 seconds. %// Method #1
Elapsed time is 0.803826 seconds. %// Method #2

...对于N = 10:

Elapsed time is 55.3068 seconds.  %// Method #1
Elapsed time is 1.03664 seconds.  %// Method #2

对于N 的大值,不仅nchoosek 会失败,而且速度也会变慢。

【讨论】:

【参考方案2】:

这是一种更快的方法,使用您正在寻找二进制数表示的子集这一事实:

b = dec2bin(1:2^N-1);
x =  b-'0';
x = x(sum(x,2)==N/2,:);

性能对比:

N = 8;

% Dennis solution
tic
b = dec2bin(1:2^N-1);
x =  b-'0';
x=x(sum(x,2)==N/2,:);
toc

% Eitan Method 2
tic
for k = 1:1e3
    C = cell(N, 1);
    [C:] = ndgrid([true, false]);
    p = cellfun(@(x)x(:), C);
    p = [p:];
    p = p(sum(p, 2) == N / 2, :);
end
toc

给出这些时间:

Elapsed time is 0.002200 seconds.
Elapsed time is 0.594309 seconds.

请注意,两种解决方案的结果行将采用不同的顺序。

【讨论】:

以上是关于matlab中1和0等概率的所有组合的二进制矩阵的主要内容,如果未能解决你的问题,请参考以下文章

在 Matlab 中生成矩阵的所有可能组合

Matlab:按行组合多个矩阵

matlab如何统计矩阵中大于或小于某数的元素个数?

如何在matlab中绘制概率密度函数?

在给定二进制 MxN 矩阵和切换列的能力的情况下最大化行相同性?

在 MATLAB 中查找互补向量的快速方法