在matlab中使用fprintf函数从可变矩阵大小中每行打印16个值

时间:2013-05-28 18:26:28

标签: matlab printf

我有一个循环,每次都输出可变数量的值,我想使用fprintf函数来打印这些值,这样每行只包含16个值。我不知道值的数量,因为循环每次输出不同数量的值。有什么想法吗?非常感谢

3 个答案:

答案 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"