2016-11-19 199 views
0

我想編寫一個MATLAB函數,它可以獲取未定義數量的變量,更改它們的值並以相同名稱輸出它們。我中途那裏,如果我不介意上市變量兩次:MATLAB函數重新分配未定義數量的變量值

function [varargout]=testing(varargin) 
    for i=1:nargin 
     varargout{i}=varargin{i}*2; 
    end 
end 

x=5; 
y=3; 
z=6; 
[x,y,z]=testing(x,y,z); 

但我不想列出變量名的兩倍。無論如何,我可以調用這個函數嗎?

testing(x,y,z); 

我試過使用inputname,但我無法弄清楚如何使它工作。

回答

1

盲目地調整工作區中的值是非常不可取的,並且可能導致難以檢測錯誤並使代碼難以維護。反對這個論據本質上反映了arguments against global variables。明確控制要操縱的數據將更爲可靠。是的,這可能會要求您以不同方式存儲數據。

例如,你可以使用一個structure

function testcode() 
mydata.a = 1; 
mydata.b = 2; 
mydata.c = 3; 
mydata.d = 4; 

mydata = multiplydata(mydata, 2); 
disp(mydata) 
end 

function [datastruct] = multiplydata(datastruct, n) 
varnames = fieldnames(datastruct); 
for ii = 1:length(varnames) 
    datastruct.(varnames{ii}) = datastruct.(varnames{ii})*n; 
end 
end 

,輸出:

>> testcode 
    a: 2 
    b: 4 
    c: 6 
    d: 8 

這是不是真的比任何使用varargin/varargout功能不同,但如果你寫你的代碼以這種方式從一開始就使用結構,您不必處理額外的拆包步驟(例如x = varargin{1}等)。


如果出於某種原因,你絕對必須盲目地調整你的變量(再次,請不要),那麼你可以使用assignin

function testcode() 
a = 1; 
b = 2; 
c = 3; 
d = 4; 

multiplydata(2, a, b, c, d); 
fprintf('a: %u\nb: %u\nc: %u\nd: %u\n', a, b, c, d) 
end 

function multiplydata(n, varargin) 
for ii = 1:length(varargin) 
    varname = inputname(ii + 1); 
    assignin('caller', varname, varargin{ii}*n) 
end 
end 

將返回:

>> testcode 
a: 2 
b: 4 
c: 6 
d: 8