2014-07-27 53 views
0

Iam是matlab中的初學者。 我有一個數組的數組。說5(4,2,1,4,3) 這意味着變量1可以取值從0到1,變量2可以取值1,2 變量3可以取0和1,變量4可以取從0到4,變量5可以取自0 t0 3.matlab中變量大小的數字可能組合

我試過在matlab中使用「combntns」,但它是一個特定的,而不是像我的情況,其中每個變量都有定義的數字集。 我需要所有組合。我嘗試使用循環

for a=i1:-1:0 
    for b=i2:-1:0 
     for c =i3:-1:0 
      for d=i4:-1:0 
       for e = i5:-1:0 
       com(j,1)=a; 
       com(j,2)=b; 
       com(j,3)=c; 
       com(j,4)=d; 
       com(j,5)=e; 
       j=j+1;      
      end 
     end 
    end 
end 

我不想使用這些許多循環。如果我的數組大小增加到100個數字,那麼爲循環寫入100是一項非常重要的任務。 任何人都可以用代碼推薦我嗎?

回答

0

我設法遞歸解決問題以下列方式:

A = [ 0 1 
     1 2 
     0 1 
     0 4 
     0 3 ]; %// <= This is the example that you gave. 

out = recursivePermutations(A,[]); 

功能recursivePermutations是:

function out = recursivePermutations(boundsMat,previousCombos) 

if size(boundsMat,1)==0 
    out = previousCombos; 
    return; 
else 
    lowBound = boundsMat(end,1); 
    uppBound = boundsMat(end,2); 
    tmp = (lowBound:uppBound)'; 

    if ~isempty(previousCombos)   
     tmp = [repmat(previousCombos,[length(tmp),1]),... 
      reshape(repmat(tmp',[length(previousCombos),1]),... 
      length(previousCombos)*length(tmp),1)]; 

    end 
    out = recursivePermutations(boundsMat(1:end-1,:),tmp); 
end 

結果是尺寸160 * 5的向量。這相當於你在這個例子中應該得到的數量(2 * 2 * 2 * 5 * 4)。