使用矢量值(每种格式不同)填充单元格数组的有效方法是什么。
例如:
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)) ... }
答案 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
以细胞方式连接。