【发布时间】:2011-01-21 14:10:58
【问题描述】:
我想知道 MATLAB 中是否有一种有效的方法来生成所有具有有限集合元素的固定长度向量。
例如,我如何构建所有长度为 5 且只有 0 或 1 作为元素的向量?
【问题讨论】:
我想知道 MATLAB 中是否有一种有效的方法来生成所有具有有限集合元素的固定长度向量。
例如,我如何构建所有长度为 5 且只有 0 或 1 作为元素的向量?
【问题讨论】:
构建所有长度为 5 且只有 0 或 1 作为元素的向量的正确方法是
a = dec2bin(0:31,5) - '0';
我希望你明白为什么。
【讨论】:
-'0' 是一个我不知道的很酷的技巧,所以我不能向量化那个循环(当然我试过了)。谢谢!我将编辑我的答案 - 这使它成为一个单行。
不是你需要的,但是 permv 生成向量排列。如果找不到精确解,可以调整向量排列。
【讨论】:
MathWorks 的FileExchange 是你的朋友:
所以使用第一个函数,就这么简单:
VChooseKRO([0 1], 5)
您甚至可以将其用于作为有限集的字符串元胞数组:
C = {'a' 'b' 'c' 'd'};
C( VChooseKRO(1:numel(C), 2) )
【讨论】:
新答案:
您可以改用BITGET 函数来加速DEC2BIN 解决方案suggested by AB(在woodchips 的协助下)。有两种方法可以解决这个问题。第一个使用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 和 @987654329 的一种方法@(因为 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];
【讨论】: