3

この質問このMathworksのヘルプをカンマ区切りで組み合わせて使用​​ します。私はフォーマットの引数をもう少しきれいにするために、この醜い方法を思いつきました:

formatting{1,1} = 'color';      formatting{2,1} = 'black';
formatting{1,2} = 'fontweight'; formatting{2,2} = 'bold';
formatting{1,3} = 'fontsize';   formatting{2,3} = 24;

xlabel('Distance', formatting{:});

しかし、それはまだちょっと醜いです...構造体をPython辞書のような引数の束にアンパックする方法はあり**kwargsますか?

たとえば、(IMHO) よりクリーンな構造があるとします。

formatting = struct()
formatting.color = 'black';
formatting.fontweight = 'bold';
formatting.fontsize = 24;

なんとかしてそれを渡すことはできますか?直接 ( xlabel('blah', formatting)、またはを試してみるとformatting{:}、「引数の数が間違っています」と言って失敗します。

4

2 に答える 2

7

この関数を使用して、構造体をセル配列に変換できます。

function c = struct2opt(s)

fname = fieldnames(s);
fval = struct2cell(s);
c = [fname, fval]';
c = c(:);

それで

formatting = struct2opt(formattingStructure);
xlabel('Distance', formatting{:});
于 2013-02-21T22:17:46.460 に答える
7

あなたはとても近くにいます。1 次元 cell 配列に切り替えるだけです。

formatting = {'Color', 'Red', 'LineWidth', 10};
figure
plot(rand(1,10), formatting{:})

引数をフォーマットするために本当に構造体を使用したい場合は、それをセル配列にアンパックして、上記のように使用できます。

formattingStruct = struct();
formattingStruct.color = 'black';
formattingStruct.fontweight = 'bold';
formattingStruct.fontsize = 24;

fn = fieldnames(formattingStruct);
formattingCell = {};
for i = 1:length(fn)
    formattingCell = {formattingCell{:}, fn{i}, formattingStruct.(fn{i})};
end

plot(rand(1,10), formatting{:})

簡単に再利用できるように、構造体を個別の小さな関数としてアンパックすることをお勧めします。

于 2013-02-21T22:12:49.100 に答える