簡體   English   中英

Matlab排列

[英]Matlab permutation

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

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)

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

你的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

現在perm_impl所有運行都在同一個單元陣列res ,因為Matlab文檔說:

嵌套函數中的變量不僅可以訪問它們的直接函數。 在嵌套函數中為其賦值或使用的變量x駐留在最外層函數的工作空間中,它們都包含嵌套函數並訪問x

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

但是,如果您以這種方式無意中使用變量,則可能導致意外行為。 如果突出顯示表明變量的范圍跨越多個函數,並且這不是您的意圖,請考慮:

  • 重命名嵌套的函數變量,使其與外部函數變量名稱不匹配。

  • 將變量作為輸入參數傳遞給函數,而不是直接在嵌套函數中使用變量

我不知道是否a應該被共享或不...

暫無
暫無

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

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