在Matlab中将结构传递给函数时重新分配变量

时间:2012-07-11 01:51:31

标签: function matlab arguments conventions structure

我正在使用一系列MatLab函数,这些函数需要10个以上的单值参数。我使用结构来传递参数以保持代码可读。函数头的示例(输入是结构):

function output = myFunction(input)

我发现在整个代码中键入结构名称会使其更难阅读:

calc1 = input.var1 * input.var2;
calc2 = input.var2 * input.var3;

我意识到上面的例子可以方便地使用数组,但我的大多数参数都是不相关的,并且有不同的类型。另外,我对变量执行的操作比上面的例子更复杂,并且不适合于数组。

我可以创建变量名来接受输入结构中的值:

function output = myFunction(input)

var1 = input.var1;
var2 = input.var2;
var3 = input.var3;

calc1 = var1 * var2;
calc2 = var2 * var3;

这样做会在函数顶部创建一个长块,除了重新分配输入变量之外什么都不做,并且必须复制数据,因此会降低性能。另一方面,代码更容易阅读。

是否有可以提供指导的编码约定?我已经在Google和Google上发现了大量资源,建议使用结构将大量数据传递给MatLab函数,但对于如何智能地执行此操作却很少。

1 个答案:

答案 0 :(得分:1)

如果编写一个解析输入参数的函数,并将其设计为接受结构作为输入或变量列表,那该怎么样呢。

示例:

function output = myFunc(varargin)
    narginchk(1,3);
    [var1,var2,var3] = parseInput(varargin{:});

    fprintf('var 1 = %g\n', var1);
    fprintf('var 2 = %g\n', var2);
    fprintf('var 3 = %g\n', var3);
    output = var1+var2+var3;
end

function [var1,var2,var3] = parseInput(varargin)
    if nargin == 1 && isstruct(varargin{1})
        var1 = varargin{1}.var1;
        var2 = varargin{1}.var2;
        var3 = varargin{1}.var3;
    elseif nargin == 3
        [var1,var2,var3] = deal(varargin{:});
    else
        error('myFunc:parseInput', 'Incorrect input')
    end
end

现在我们可以将函数调用为:

x = myFunc(1,2,3)

或:

in = struct('var1',1, 'var2',2, 'var3',3);
x = myFunc(in)

当然,您可以添加更严格的验证来检查输入(请参阅validateattributesInputParser