【发布时间】: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