MATLAB函数重新分配未定义数量的变量值

时间:2016-11-19 06:54:29

标签: matlab variadic-functions

我想编写一个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 个答案:

答案 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