2014-03-13 70 views
0

我寫了一個函數來執行n個obejects的排列。 我有變量a = [1],[2],[3]; k = 1和n = 4; a分別包含1,2和3的對象。以下是我寫的函數代碼:Matlab排列

function [res]=perm(a,k,n,jj) 

if k==n 
    res{jj}=a; 
    jj=jj+1; 

else 
    for i=k:n 
     t=a{k}; 
     a{k}=a{i}; 
     a{i}=t; 
    perm(a,k+1,n,jj) 
    t=a{k}; 
    a{k}=a{i}; 
    a{i}=t; 
    end 
end 
end 

然而,當我調用該函數爲:

jj=1; 

    [res]=perm(a,k,n,jj) 

我越來越顯示以下錯誤:

Error in ==> perm at 3 
if k==n 

??? Output argument "res" (and maybe others) not assigned during call to "J:\main 
project\perm.m>perm". 

Error in ==> mainp at 254 
    [res]=perm(a,k,n,jj) 

以下是關於主程序代碼到排列:

mr=4 
    for i=1:mr 
     a{i}=i; 
    end 
    n=mr; 
    %This assignment is for the ease to work with. 
    %just stored the indices till mr for the purpose of permutation 
    k=1; 
    %this is the k that the function perm has 

    jj=1; 

    [res]=perm(a,k,n,jj) 

有人可以幫我解決這個問題嗎?在此先感謝。

+0

是否有可能'perm'是'perm.m'裏面的一個嵌套函數?是否有可能在'perm'之外的範圍內有一個變量'res'? – Shai

+0

你能分享你的全部代碼嗎?看起來你沒有正確地調用這個函數。 '錯誤在==> mainp at 254 [res] = perm(a,k,n,jj)' –

+0

錯誤信息看起來不錯,即使這個位置不是。確保每個通過'perm'的路徑都分配了'res'。現在只在'k == n'時才分配。 –

回答

2

您的else塊葉res未定義。

我想你假設res是一個全局變量,所有調用perm將寫入單個單元格數組的不同部分。那是不正確的。它是當前調用的本地輸出變量。在遞歸過程中沒有共享,它們都有獨立的單元陣列,名爲res。參數jj也不共享,所以添加一個也沒用。

如果您想使用這種構建輸出的技術,您需要確保它的定義範圍比遞歸更廣。例如,使用一個本地助手功能:

function [res]=perm(a,k,n,jj) 
    res = {}; 
    perm_impl(a,k); 

    function [] = perm_impl(a,k) // doesn't get its own local res, n, or jj 
     if k==n 
      res{jj}=a; 
      jj=jj+1; 
     else 
      for i=k:n 
       t=a{k}; 
       a{k}=a{i}; 
       a{i}=t; 
       perm_impl(a,k+1) 
       t=a{k}; 
       a{k}=a{i}; 
       a{i}=t; 
      end 
     end 
    end 
end 

現在同樣的單元陣列resperm_impl工作的所有運行,因爲Matlab的文件說:嵌套函數內

變量都可以訪問到的不僅僅是他們的直接功能。變量x,您在嵌套函數中爲其分配值或使用的變量駐留在最外層函數的工作空間中,該函數都包含嵌套函數並訪問x

如果你故意以這種方式使用變量,這不是問題。有關示例,請參見嵌套函數上的MATLAB編程演示。

但是,如果您無意中以這種方式使用變量,則可能會導致意外的行爲。如果高亮指示變量的範圍跨越多個功能,這是不是你的意圖,可考慮:

  • 重命名嵌套函數變量,因此它不匹配的外部函數的變量名。

  • 傳遞變量到函數作爲輸入參數,而不是直接使用嵌套函數

內的變量我不能告訴a是否是應該被共享或不.. 。

+0

那麼我怎樣才能使它成爲全球性的,這樣我就可以將所有的排列組合存儲起來用於未來的處理? –

+0

非常感謝。有效。但我還有一個疑問。儘管使用了本地函數,但它仍被遞歸地調用。因此,如何在這裏準確地構建輸出。我的意思是每個本地幫助函數的實例都應該有它自己的局部變量,我想呢? –

+0

本地函數的每個實例都有其自己的局部變量的單獨副本,是的。但res不屬於本地函數......只有'a'和'k'是輔助函數的局部。 –