【问题标题】:How to generate only half of all binary combinations (MATLAB R2015b)如何仅生成所有二进制组合的一半(MATLAB R2015b)
【发布时间】:2017-10-23 17:09:28
【问题描述】:

我正在使用以下代码生成长度为 n_t 的所有二进制组合 M

来源:https://www.mathworks.com/matlabcentral/newsreader/view_thread/164002

function M = all_poss(n_t)

% algorithm: recursion 
% remarks: slow for n_t>22

 if n_t > 1 
     L = all_poss(n_t - 1);
     row = size(L,1);
     M = [zeros(row,1) L; ones(row,1) L];  
 else
     M = [0;1];  
 end

这段代码对于 n_t>20 非常慢。

因为给定长度的二进制组合可以配对,例如

[0 0 0] [1 1 1]
[0 0 1] [1 1 0]
[0 1 0] [1 0 1]
[0 1 1] [1 0 0],

实现效率的一种方法是只生成其中的一半,并通过赞美获得另一半。

我想知道如何修改上面的代码,使它只生成一半的二进制组合,还是我应该为此编写全新的代码?

【问题讨论】:

  • 当您可以使用十进制转二进制函数动态生成 2^20 个二进制数时,为什么还需要打印出来?
  • 烧杯在代码中的含义:all_poss = @(x)dec2bin(1:(2^x-1))=='1';
  • 可以,但效率不高。需要永远
  • 生成 2^20 个二进制数需要很长时间。同样,为什么您需要一次所有个数字?我建议您只在需要时生成 一个 组合,而不是生成 2^20 个组合并存储它们。
  • 这看起来是一个可行的选择。感谢您的建议。

标签: matlab combinations


【解决方案1】:
function M = all_poss_half(n_t)

n=1;
M = [0;1];
while n<n_t           
    N = cat(2,zeros(size(M,1),1),M);    
    M = cat(1,N,flipud(1-N));  %flipud(.) is not essential here. 
    n=n+1;        
end

【讨论】:

  • 您能解释一下您的解决方案吗?
  • 你试过运行它吗?它通过连接 N 及其补码 1-N 生成所有可能的二进制组合 M。
  • 不,我没有。不过,如果您能解释一下您的解决方案想法,那就太好了,这样有类似问题的用户就会从中受益。
猜你喜欢
  • 1970-01-01
  • 2015-03-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多