如何以所需格式自动sprintf数组元素

时间:2017-05-21 08:43:13

标签: arrays matlab printf

我有许多具有不同列数的数组,也就是说,我有许多1 * m矩阵,m从1到20不等。例如,考虑这三个假设数组:

 A1 = [1 14 20 8]
 A2 = [5 1 20]
 A3 = [2]

我所追求的是为每个数组创建一个sprintf,将所有数组元素组合在一起,使元素以点分隔。对于上面的例子,所需的输出是

 1.40.20.8  % sprintf('%d.%d.%d.%d', A1(1,1), A1(1,2), A1(1,3), A1(1,4)); three dots required
 5.1.20      % sprintf('%d.%d.%d', A2(1,1), A2(1,2), A2(1,3)); two dots required
 2           % sprintf('%d', A3(1,1)); no dot required 

如果所有数组具有相同数量的列,则肯定更简单。但由于情况并非如此,我不知道如何继续。我只想要一个算法,它可以为我自动生成具有正确点数的sprintf。

感谢。

4 个答案:

答案 0 :(得分:1)

自动化过程的第一步是找到一种方法来自动识别要打印的数组(A1,A2,...)。

如果您无法修改生成数组的代码,以便将它们存储在cellarray或结构中,您可以这样做:

  • 使用函数who
  • 获取工作区中的变量列表
  • 使用A
  • 选择名称为regexp,后跟整数值的名称
  • 使用tempname将这些变量保存在临时文件中以生成临时文件的名称
  • 加载临时文件以获得struct字段是您想要打印的变量
  • 循环结构以打印变量
  • 使用正确数量的sprintf标识符定义%d格式,您可以使用repmat函数以及length
  • 可选地,您可以将字符串存储在cellarray中以供进一步使用
  • 循环后,
  • 删除先前已将recycle设置为on的临时文件,以允许在回收文件夹中移动临时文件

可能的实施:

A1 = [1 14 20 8]
A2 = [5 1 20]
A3 = [2]

% Identify the desired variables
A_vars=who;
var_idx=regexp(A_vars,'A\d$');
idx=~cellfun(@isempty,var_idx);
% Create a temporary ".mat" file
tmp_file=[tempname '.mat'];
% Save the variables
save(tmp_file,A_vars{idx});
% Load the variables in a struct
A_vars=load(tmp_file);
% Loops over the varaibles to be printed
names_A=fieldnames(A_vars);
for i=1:length(names_A)
   % Get the length of the current array
   n=length(A_vars.(names_A{i}));
   % Create the sprintf format
   fmt=repmat('%d.',1,n);
   % Print the current variable in a string
   str=sprintf([fmt],getfield(A_vars,(names_A{i})));
   % Remonve the last "."
   str(end)=[];
   % Store the strings for further usage
   list_of_vars_string{i}=str;
   % Disp the current variable
   disp(str)
end
recycle('on')
delete(tmp_file)

希望这有帮助,

Qapla'

答案 1 :(得分:0)

您可以在strsplit输出上使用strjoinnum2str,从数字向量生成以空格分隔的字符串:

A{1} = [1 14 20 8];
A{2} = [5 1 20];
A{3} = [2];

for ii = 1:numel(A)
    str = num2str(A{ii});
    str = strjoin(strsplit(str),'.');
    disp(str)
end

输出:

1.14.20.8
5.1.20
2

答案 2 :(得分:0)

如果第二个输入是数组,则

sprintf格式说明符会根据需要自动重复使用多次。也就是说,sprintf('%i.',A1)给出1.14.20.8.。一旦完成,只剩下去除最终点,这可以通过索引来完成。所以,

A1 = [1 14 20 8];
result = sprintf('%i.',A1);
result = result(1:end-1);

给出

result =
1.14.20.8

答案 3 :(得分:0)

A1 = [1 14 20 8] ;
fprintf([repmat('%d.', 1, size(A1, 2)-1),'%d' '\n'],A1)