2013-02-21 86 views
3

使用的this questionthis Mathworks help thing on comma sep. lists组合,我想出了这个丑陋的方式让我格式化参数有点漂亮:如何将Matlab结构解压到函数参数中?

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{:},它胡扯出来说“的参数数目错误”。

回答

6

你非常接近,只是切换到1-d单元阵列。

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

这可能是一个好主意,做了结构拆包一个单独的小功能,让您可以轻松地重用。

6

您可以将您的结构,细胞与此功能阵列:

function c = struct2opt(s) 

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

然后

​​