我想知道在MATLAB中是否有一种有效的方法来生成具有有限集元素的固定长度的所有向量。
例如,如何构建长度为5且仅包含0或1作为元素的所有向量?
答案 0 :(得分:10)
构建长度为5且仅有0或1为元素的所有向量的正确方法是
a = dec2bin(0:31,5) - '0';
我希望你明白为什么。
答案 1 :(得分:3)
不完全符合您的需求,但permv会生成矢量排列。如果找不到确切的解决方案,可以调整矢量排列。
答案 2 :(得分:3)
MathWorks'FileExchange是你的朋友:
所以使用第一个函数,就像它一样简单:
VChooseKRO([0 1], 5)
您甚至可以将其用作字符串的单元格数组作为有限集:
C = {'a' 'b' 'c' 'd'};
C( VChooseKRO(1:numel(C), 2) )
答案 3 :(得分:1)
新答案:
您可以使用DEC2BIN功能加快suggested by AB解决方案woodchips(BITGET的帮助)。有两种方法可以解决这个问题。第一个使用REPMAT函数使输入大小相等(均为32×5矩阵):
allCombos = bitget(repmat((0:31)',1,5),repmat(5:-1:1,32,1));
第二个只是为你想要获得的每个位调用BITGET一次:
vec = (0:31)';
allCombos = [bitget(vec,5) bitget(vec,4) bitget(vec,3) ...
bitget(vec,2) bitget(vec,1)];
以下是一些示例时间:
Method | Average Time
-----------------+------------------
DEC2BIN | 0.000788 s
BITGET+REPMAT | 0.000727 s
BITGET x5 | 0.000045 s
如您所见,展开的BITGET非常快。
旧答案:(后代)
如果你想构建一个的每个可能的向量矩阵和长度为5的矩阵,这将是使用函数PERMS和它的一种方法。 UNIQUE(因为PERMS会创建重复的行):
allCombos = [0 0 0 0 0;
unique(perms([0 0 0 0 1]),'rows'); ...
unique(perms([0 0 0 1 1]),'rows'); ...
unique(perms([0 0 1 1 1]),'rows'); ...
unique(perms([0 1 1 1 1]),'rows'); ...
1 1 1 1 1];