2013-02-21 54 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(:); 

然後

​​