如何将Matlab结构解压缩为函数参数?

时间:2013-02-21 21:57:57

标签: matlab

使用this questionthis Mathworks help thing on comma sep. lists的组合我提出了这种丑陋的方式,使我的格式化参数更漂亮:

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)formatting{:},它就会说“参数数量错误”。

2 个答案:

答案 0 :(得分:7)

您可以使用此功能将结构转换为单元格数组:

function c = struct2opt(s)

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

然后

formatting = struct2opt(formattingStructure);
xlabel('Distance', formatting{:});

答案 1 :(得分:6)

你非常接近。只需切换到1-D单元阵列即可。

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

如果你真的想使用struct来格式化参数,你可以将它解压缩到一个单元格数组并像上面一样使用它。

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{:})

将struct解压缩一个单独的小函数可能是一个好主意,这样你就可以轻松地重用它。