我有一个循环,每次输出可变数量的值,我想使用 fprintf 函数打印这些值,以便每行仅包含 16 个值。我不知道值的数量,因为循环每次输出不同数量的值。请问有什么想法吗?多谢
问问题
5235 次
3 回答
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
当然,形式的变体也可以用来代替我给出的前两个解决方案,但是打印字符串可能更难阅读。
于 2013-05-28T18:40:34.370 回答
0
为什么不对 fprintf 函数使用显式计数器:
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
于 2013-05-28T23:03:29.357 回答
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"
于 2014-07-15T17:08:41.847 回答