我想编写一个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,但我无法弄清楚如何使其工作。
答案 0 :(得分: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