2017-05-26 49 views
2

我基本上試圖找出如何生成M對象的不同配置的基向量代碼到N個不同的狀態(例如,如果我有2個孩子之間有2個零食,我可以有(2,0)(0,2)或(1,1),可怕的例子,但多數民衆贊成在想法)在matlab中生成所有可能的列向量

我很努力弄清楚如何做到這一點,而不進入許多不同的循環(我希望這自動)。這個想法是創建一個矩陣,其中每一行是一個長度爲M的向量。我將從vec(1)= N開始,然後是一個if循環,如果sum(vec)== N,Matrix(1,:)= vec ;然後我可以採取vec(1)= N-i並且執行相同的操作。

我唯一的問題是我沒有看到如何使用if和forget它,所以如果我有5個位置可能有2個對象,我將如何做到這一點(1 0 0 0 1)。

我不知道該怎麼做。

+0

因此,對於5點位置和20個對象,您的載體將包括'[14 0 3 2 1]'和'[2 1 3 9 5]'? – beaker

+0

在交易所有一個叫做'combn'的函數。檢查一下它是否做到了你想要的。 – Matt

回答

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 
1

我想這你想要做什麼。

關鍵的想法是不產生每個組中元素的數量,但是在組之間產生分裂點。這可以通過與重複的組合完成。 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 
1

這是一個沒有bsxfun類似的方法來路易斯。因爲我們不喜歡好玩。

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],我們更換位置24與分區看起來是這樣的:

[ 0 | 0 | 0 0 0 ] 

O的值是一元的,所以這個組合是1 1 3。爲了容易恢復這些值,我們只需在數組左右兩側的下一個值(0n+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 
相關問題