我有许多具有不同列数的数组,也就是说,我有许多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。
感谢。
答案 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
输出上使用strjoin
和num2str
,从数字向量生成以空格分隔的字符串:
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)