3

结合使用这个问题这个 Mathworks 在逗号 sep 上的帮助。列表我想出了这种丑陋的方式来使我的格式化参数更漂亮一点:

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

例如,如果我有(恕我直言)更清洁的结构:

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

我可以以某种方式传递它吗?如果我直接尝试 ( xlabel('blah', formatting), or formatting{:},它会说“参数数量错误”。

4

2 回答 2

7

You can convert your structure to cell array with this function:

function c = struct2opt(s)

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

Then

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

你很亲密。只需切换到一维单元阵列。

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