![](/img/trans.png)
[英]How to generate all possible combinations for the column vectors of a matrix, in MATLAB?
[英]Generate all possible column vectors in matlab
我本質上是在試圖找出如何為M對象的不同配置的基向量生成代碼到N個不同狀態的代碼(例如,如果我在2個孩子之間有2個零食,我可能會擁有(2,0)(0,2)或(1,1),一個可怕的例子,但這就是想法)
我正在努力弄清楚如何做到這一點,而不必進入許多不同的循環(我希望這是自動的)。 想法是創建一個矩陣,其中每一行都是長度為M的向量。我將從vec(1)= N開始,然后是一個if循環,其中if sum(vec)== N,Matrix(1,:)= vec ; 然后,我可以采用vec(1)= Ni並執行相同操作。
我唯一的問題是我看不到如何使用if並忘記了它,所以如果我可能在5個位置中有2個對象,我將如何獲得(1 0 0 0 1)。
我沒有看到如何執行此操作。
您可以使用遞歸函數:
function out = combos(M,N)
if N == 1
out = M;
else
out = [];
for i = 0:M
subout = combos(M-i,N-1);
subout(:,end+1) = i;
out = [out;subout];
end
end
我認為這可以滿足您的需求。
關鍵思想是不生成每個組中元素的數量,而是生成組之間的分割點 。 這可以通過與重復結合來完成。 Matlab的nchoosek
生成的組合沒有重復,但是很容易將它們轉換成我們需要的組合。
M = 5; % number of objects
N = 3; % number of groups
t = nchoosek(1:M+N-1, N-1); % combinations without repetition...
t = bsxfun(@minus, t, 1:N-1); % ...convert into combinations with repetition
t = diff([zeros(size(t,1), 1) t repmat(M, size(t,1), 1) ], [], 2); % the size of each
% group is the distance between split points
在此示例中,結果是
t =
0 0 5
0 1 4
0 2 3
0 3 2
0 4 1
0 5 0
1 0 4
1 1 3
1 2 2
1 3 1
1 4 0
2 0 3
2 1 2
2 2 1
2 3 0
3 0 2
3 1 1
3 2 0
4 0 1
4 1 0
5 0 0
這與沒有bsxfun
Luis相似。 因為我們不喜歡娛樂。
n = 5;
k = 3;
c = nchoosek(n+k-1, k-1);
result = diff([zeros(c, 1) nchoosek(1:(n+k-1), k-1) ones(c, 1)*(n+k)], [], 2) - 1;
這將創建長度為k
的整數n
的分區。 給定長度為n + (k-1)
的數組,我們找到(k-1)
位置的所有組合,以在(一元)整數之間放置分區。 對於5個項目和3個位置,我們有7種選擇來放置分區:
[ 0 0 0 0 0 0 0 ]
如果我們選擇的組合為[2 4]
,那么我們將2
和4
替換為分區,如下所示:
[ 0 | 0 | 0 0 0 ]
O
給出一元值,因此此組合為1 1 3
。 為了輕松恢復這些值,我們只在數組左右兩側的下一個值( 0
和n+k
)處用虛數分區擴展組合,然后求和並減去1
(因為分區本身對價值):
diff([0 2 4 8]) - 1
ans =
1 1 3
通過將分區滑入每個可能的位置組合,我們得到n
所有分區。
輸出:
result =
0 0 5
0 1 4
0 2 3
0 3 2
0 4 1
0 5 0
1 0 4
1 1 3
1 2 2
1 3 1
1 4 0
2 0 3
2 1 2
2 2 1
2 3 0
3 0 2
3 1 1
3 2 0
4 0 1
4 1 0
5 0 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.