0

我有一个循环,每次输出可变数量的值,我想使用 fprintf 函数打印这些值,以便每行仅包含 16 个值。我不知道值的数量,因为循环每次输出不同数量的值。请问有什么想法吗?多谢

4

3 回答 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 回答