11

どのような状況でリテラル:を Matlab 関数に渡すことができますか? 実験の結果、リテラル:が string として渡されることもあれば':'、エラーが発生することもあることがわかりました。例えば:

>> type writeargs

function writeargs(varargin)

disp(varargin);

end

>> writeargs(:)
Undefined variable writeargs.

>> writeargs(:, 1)
Undefined variable writeargs.

>> writeargs(:, 1, :)
    ':'    [1]    ':'

>> writeargs(:, :, :)
    ':'    ':'    ':'

>> writeargs(1, 2, :, 4, 5)
    [1]    [2]    ':'    [4]    [5]

>> writeargs(1, 2, :, end)
Error using writeargs
Too many output arguments.

この構文は、少なくとも 3 つの引数が渡された場合に許可されるという印象を受けました。それは恣意的に見えます。ここでの法的な構文は何ですか?

編集:ユースケースを求められたコメント。ユースケースは、引数がスライスまたはインデックスとして使用される場合に発生する可能性があります。Python コードでは、スライス オブジェクトをメソッドに渡すケースがありました。1 つの使用例は、この回答に触発されたような関数の場合です。ここでは、Matlabs が解釈できないことを回避するために小さな関数が使用されmagic(5)(3, :)、ヘルパー関数を作成して で呼び出すことができますparen(magic(5), 3, :)

4

2 に答える 2

1

writeargs(:) と writeargs(:,1) は、writeargs をローカル スコープの変数として扱い、コロン演算子を使用して「存在しない」変数にインデックスを付けようとしています。

3つ以上の引数で関数が呼び出されています...申し訳ありませんが、この動作が存在する理由はわかりませんが、3つ以上ではなく、1つまたは2つの引数で暗黙的にsubsrefを呼び出していると思われます。

関数の disp 呼び出しにブレークポイントを設定することでテストできます。3 つ以上の引数が指定された場合にのみヒットすることがわかります。

于 2013-03-29T14:43:21.197 に答える