2014-11-22 72 views
1

我試圖建立所有可能的數組的長度n的n個元素的矢量,每個位置至少有2個整數。我應該得到2^n個組合,在這種情況下是16。我的代碼生成只有一半,輸出不保存到一個數組從子陣列向量構建所有可能的陣列。隨着遞歸

allinputs = {[1 2] [2 3] [3 4] [5 6]} 
A = [] 

我運行的命令是

inputArray = inputBuilder(A,[],allinputs,1) 

的功能

function inputArray = inputBuilder(A,currBuild, allInputs, currIdx) 

    if currIdx <= length(allInputs) 

     for i = 1:length(allInputs{currIdx}) 
      mybuild = [currBuild allInputs{currIdx}(i)]; 
      inputBuilder(A,mybuild,allInputs,currIdx + 1); 

     end 

     if currIdx == length(allInputs) 
      A = [A mybuild]; 

      %debug output 
      mybuild 
     end 


     if currIdx == 1 
      inputArray = A; 
     end 


    end 

end 

我希望所有16數組獲取矢量中的輸出。或者一些簡單的方法來訪問它們。我怎樣才能做到這一點?

編輯: 遞歸可能是一個要求,因爲所有的輸入將有不同長度的子陣列。 allinputs = {[1] [2 3] [3 4] [5 6 7]}

與此陣列這將是1個* 2個* 2個* 3或12個可能的內置陣列

+2

爲什麼不使用現有的方法/函數來獲取矢量或單元格的所有可能組合?或者,也許你想要一些複雜的? – Marcin 2014-11-22 02:15:18

+0

例如,使用文件交換中的'allcomb.m'功能並生成所有可能的組合。相應地索引您的單元陣列。使用遞歸是你的一個要求嗎? – 2014-11-22 02:20:34

+0

遞歸不是要求,但這是我的想法。也想更好地學習matlab,但Marcin的答案非常接近。謝謝! – Drew 2014-11-22 04:18:37

回答

0

不知道確切如果這是你想要的,但這樣做的一個辦法是什麼我想你想要做的是如下:

allinputs = {[1 2] [2 3] [3 4] [5 6]}; 

    comb_results = combn([1 2],4); 

    A = zeros(size(comb_results)); 
    for rowi = 1:size(comb_results, 1) 
     indices = comb_results(rowi,:); 

     for idxi = 1:numel(indices) 
      A(rowi, idxi) = allinputs{idxi}(indices(idxi)); 
     end 

    end 

這給:

A = 

    1  2  3  5 
    1  2  3  6 
    1  2  4  5 
    1  2  4  6 
    1  3  3  5 
    1  3  3  6 
    1  3  4  5 
    1  3  4  6 
    2  2  3  5 
    2  2  3  6 
    2  2  4  5 
    2  2  4  6 
    2  3  3  5 
    2  3  3  6 
    2  3  4  5 
    2  3  4  6 

combnhere

+0

我敢肯定,我可以弄明白,但如果我想要在自己的數組中的每一行? – Drew 2014-11-22 04:23:33

+0

@在這種情況下,可以將A作爲單元陣列並相應地調整代碼。 – Marcin 2014-11-22 04:28:39

+0

實際上它看起來像遞歸可能是一個要求,因爲allinputs將不具有所有相同長度的子數組。任何想法是什麼基本的部分matlab遞歸是我不明白? – Drew 2014-11-22 05:03:29