2012-09-20 47 views
1

我有函數f1必須包含的子功能,所以我不能使用其他腳本:MATLAB - 可能使用某種類型的可變參數清理函數中的變量...?

function vars = f1() 

    a = 1; 
    b = 'hello'; 
    c = {[1 2 3]}; 

    currvars = whos; %all variable info 
    for k = 1:size(currvars, 1) 
     eval(['vars.(currvars(k).name) = ' currvars(k).name ';']); 
    end 

end 

我調用腳本的功能,然後我創建使用genvarname()和eval腳本變量():

vars = f1(); 
varnames = genvarname(fieldnames(vars)); 
for k = 1:size(varnames(:),1) %Creates vars with the struct's fieldnames. 
    eval([varnames{k} ' = vars.' varnames{k} ';']); 
end 
clearvars vars varnames 

我想同時讀出所有變量只對腳本調用它,以適應變量創建過程變成一個函數不知怎麼的,但我不希望分配一百個不同的變量名輸出。有沒有人有任何建議如何做到這一點?

+2

可能是一個想法的語言標記,或提到它的稱號。我的第一個問題是 –

+0

。謝謝你的保鏢! –

回答

0

信貸羅迪...

#Old semi-"global" variables: 

function vars = f1() 

    a = 1; 
    b = 'hello'; 
    c = {[1 2 3]}; 
    currvars = whos; %all variable info 
    for k = 1:size(currvars, 1) 
     eval(['vars.(currvars(k).name) = ' currvars(k).name ';']); 
    end 

end 

#Function to assign variables to the calling script's/function's workspace. Variable names are determined by the single structure's fieldnames: 
function setvars(func) 

    vars = func; 
    protected = {'If needed, put variable names you do not want here'}; 
    names = fieldnames(vars); 
    newnames = genvarname(names, protected); 
    for k = 1:numel(newnames) 
     assignin('caller', newnames{k}, vars.(names{k})); 
    end 

end 

#Script call: 

setvars(f1); 
1

請勿創建自動命名變量的大小。這是愚蠢和糟糕的編程風格。相反,學會使用數組。多維數組,單元陣列,結構數組。或者,做你所做的事情,然後被迫找到一個你想要的混合物。

請選擇。 Eval是邪惡的。

+0

我需要這樣做,因爲我正在編輯已經分配了這些變量的舊2004代碼,並且只是一個文本牆。我試圖一次清理一點。如果有人有建設性的意見,請回復。 –

+1

@JasonGarcia:我傾向於同意這裏的木片。通過採用這種可變代方法,您將來很可能會對自己造成更多的頭痛。如果你的情況真的需要這種方法,請在原始問題中更清楚地解釋你正在嘗試做什麼以及爲什麼這種方法是強制性的。 – cjh

+0

這個請求是需要的,因爲我正在處理意大利麪代碼。有很多腳本可以調用更多的腳本。我試圖縮小哪些變量被定義在何處並將代碼分類到函數中。我不能消除變量名稱,直到我知道他們在哪裏使用。我想先創建這些功能,以便使清理更容易。我也同意數組更容易解釋,但事實是代碼已經寫好了。 –

0

你可以返回與「糾正」字段名的結構:

function output = someFunc 

    vars = f1(); 

    protected = { %# some list of varnames you don't want 
    }; 

    names = fieldnames(vars); 
    newnames = genvarname(names, protected); 

    for k = 1:numel(newnames) 
     output.(newnames{k}) = vars.(names{k});    
    end 

end 

如果再使用

output = someFunc; 
varnames = fieldnames(output); 
for k = 1:numel(fieldnames) 
    eval([varnames{k} ' = output.' varnames{k} ';']); 
end 

腳本/功能,你想要的變量名,你有一個相對乾淨的在函數someFunc中鎖定一切,而不必預先定義所有輸出變量名稱。

你也可以做到這一步:

function someFunc2 

    vars = f1(); 

    protected = { %# some list of varnames you don't want 
    }; 

    names = fieldnames(vars); 
    newnames = genvarname(names, protected); 

    for k = 1:numel(newnames) 
     assignin('caller', newnames{k}, vars.(names{k})); 
    end 

end 

這意味着你只需要調用該函數

someFunc2; 

在你的腳本,函數然後定義和分配所有的變量腳本的工作區

一個微小的進步,但仍然向前:)

+0

我認爲問題在於他需要變量在工作區中可用,因爲他的代碼被其他部分使用。具有結構將需要提取結構字段並將它們分配給實際變量,以便代碼起作用。 – angainor

+0

@angainor:是的,我明白你的觀點。我編輯了我的帖子以反映它。 –

+0

@Rody:那就是甜蜜! –

相關問題