2014-12-01 68 views
1

什麼是有效的方式來填充一個單元格數組與矢量的值(每個格式不同)。MATLAB:填充單元陣列和格式編號

例如:

V = [12.3 .004 3 4.222]; 

期望電池陣列:

array = {'A = 12.30' 'B = 0.004' 'C = 3' 'D = 4'}; 

難道還有比呼籲sprintf爲每一個細胞更簡單的方法?

array = {sprintf('A = %.2f',V(1)) sprintf('B = %.3f',V(2)) ... } 

回答

1

還有的sprintf沒有量化的形式,支持不同的格式,所以你大多隻能和每單元sprintf電話。但是你可以安排代碼在循環中更容易處理。

V = [12.3 .004 3 4.222]; 
names = num2cell('A':'Z'); 
formats = { '%.2f' '%.3f' '%d' '%.0f' }; 

c = cell(size(V)); 
for i = numel(V) 
    c{i} = sprintf(['%s = ' formats{i}], names{i}, V(i)); 
end 

這將是棘手的事情不是用簡單的方式更快,而不下降到Java或C,因爲它仍然要採取sprintf()呼籲每個細胞,這是怎麼回事主宰的執行時間。

如果您有大量元素和相對較少的格式,可以使用unique()將它們分組爲一個格式的sprintf()調用,使用向量化版本的sprintf,然後分割一個分隔符來獲取單個字符串。這可能會也可能不會更快,這取決於您的確切數據集和實施。

或者您可以編寫一個MEX文件,將循環壓入C中,循環調用C的sprintf。一旦你達到中等大的輸入尺寸,這會更快。

1

這是可以做到如下:

V = [12.3 .004 3 4.222]; 
names = {'A', 'B', 'C', 'D'}; 
array = strcat(names(:), ' = ', ... 
    strtrim(mat2cell(num2str(V(:), '%.4f'), ones(1,numel(V))))).'; 

如何工作的:

  • num2str給出一個字符矩陣,使用格式說明符(你可能要改變我以前的一個)。
  • mat2cell將其轉換爲單元格數組,將每行放入單元格中。
  • strtrim刪除空格。
  • strcat連接單元格。
+0

我總是忘記'strtrim'。很有用! – chappjc 2014-12-02 01:27:00