簡體   English   中英

在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] ,那么我們將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM