我有一个循环,每次都输出可变数量的值,我想使用fprintf函数来打印这些值,这样每行只包含16个值。我不知道值的数量,因为循环每次输出不同数量的值。有什么想法吗?非常感谢
答案 0 :(得分:1)
我不知道输入变量的数据类型或输出的类型,所以这只是一个例子:
a = ones(1,20); % 20 input values
fprintf('%d',a(1:min(numel(a),16)))
>> 1111111111111111
a = ones(1,10); % 10 input values
fprintf('%d',a(1:min(numel(a),16)))
>> 1111111111
以上打印最多16个值,即使输入a
为空,也能正常工作。问题是,如果输入中的元素少于16个,则需要打印默认值。在这种情况下,这是一种方法:
a = ones(1,10); % 10 input values
default = 0; % Default value if numel(a) < 16
fprintf('%d',[a(1:min(numel(a),16)) default(ones(1,max(16-numel(a),0)))])
>> 1111111111000000
如果您有列矢量,则必须调整这些。
修改强>
要解决@Schorsch提出的问题,如果不是在数组中使用大于16的值剪切元素,而是希望将它们打印在下一行,可以这样做:
a = ones(1,20); % 20 input values
default = 0; % Default value if numel(a) < 16
fprintf('%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d\n',[a default(ones(1,16-mod(numel(a),16)))])
>> 1111111111111111
1111000000000000
当然,形式的变体也可用于代替我给出的前两个解决方案,但打印字符串可能更难以阅读。
答案 1 :(得分:0)
为什么不为fprintf-function使用显式计数器:
printIdx = 1; % Init the counter, so that after 16 iterations, there can be a linebreak
% Run a loop which just print the iteration index
for Idx = 42 : 100+randi(100,1); % Run the loop untill a random number of iterations
% ### Do something in your code ###
fprintf('%d ',Idx); % Here we just print the index
% If we made 16 iterations, we do a linebreak
if(~mod(printIdx,16));
fprintf('\n');
end;
printIdx = printIdx + 1; % Increment the counter for the print
end
答案 2 :(得分:0)
如果您有兴趣在每行的末尾智能创建换行符(无论长度如何),您可以使用“\ b”退格符删除行尾的行,然后是“\” n“开辟一条新路线。示例如下:
fprintf('%u, %u \n',magic(3)) %will end the output with "2, "
fprintf('%u, %u \n',magic(4)) %will end the output with "1 {newline}"
在任何一种情况下,发送2个退格,然后换行将导致一个干净的行结束:
fprintf('\b\b\n') % in one case, will truncate the ", " and in the other truncates " \n"