MATLAB:填充单元格数组和格式编号

时间:2014-12-01 21:56:25

标签: string 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)) ... }

2 个答案:

答案 0 :(得分: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&#s的sprintf。一旦你达到适度大的输入尺寸,那就会更快。

答案 1 :(得分: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使用格式说明符给出一个char矩阵(您可能想要更改我使用的那个)。
  • mat2cell将其转换为单元格数组,将每行放入单元格中。
  • strtrim删除空格。
  • strcat以细胞方式连接。