[英]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.