2016-11-19 154 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