[英]Generating vectors in MATLAB
我想知道在MATLAB中是否有一種有效的方法來生成具有來自有限集的元素的所有固定長度的向量。
例如,如何構建長度為5且僅包含0或1作為元素的所有向量?
構建長度為5且僅使用0或1作為元素的所有向量的正確方法是
a = dec2bin(0:31,5) - '0';
我希望你明白為什么。
不是你需要的,但是permv會產生矢量排列。 如果找不到確切的解決方案,則可以調整矢量排列。
MathWorks的FileExchange是你的朋友:
所以使用第一個函數,它很簡單:
VChooseKRO([0 1], 5)
你甚至可以使它作為有限集的字符串單元格數組:
C = {'a' 'b' 'c' 'd'};
C( VChooseKRO(1:numel(C), 2) )
新答案:
您可以使用BITGET功能加速AB建議的DEC2BIN解決方案(使用木片輔助)。 有兩種方法可以解決這個問題。 第一個使用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];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.