2

私は、10 個以上の単一値の引数を取る一連の MatLab 関数を使用しています。コードを読みやすくするために、構造体を使用して引数を渡しました。関数ヘッダーの例 (入力は構造体):

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 で、構造を使用して大量のデータを MatLab 関数に渡すことを提案するリソースをたくさん見つけましたが、それをインテリジェントに行う方法についてはほとんど貴重ではありません。

4

1 に答える 1

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)

もちろん、より厳密な検証を追加して入力をチェックすることもできます ( validateattributesおよびを参照InputParser) 。

于 2012-07-11T13:48:13.560 に答える