在命令窗口中打印进度

时间:2016-08-17 15:23:06

标签: matlab progress command-window

我想使用fprintf在命令窗口中显示代码执行进度。

我有一个 N x 1 结构数组,我们称之为myStructure。每个元素都有字段namedata。我想将name与数据点的数量并排打印,例如:

name1    number1
name2    number2
name3    number3
name4    number4
...

我可以使用repmat N 次和fprintf。问题在于所有数字都必须介于单元格数组C中的名称之间。

fprintf(repmat('%s\t%d',N,1),C{:})

我可以使用cellfun来获取数据点的名称和数量。

names = {myStucture.name};
numpoints = cellfun(@numel,{myStructure.data});

但是,我不确定如何将此格式转换为包含C的交替元素的单元格数组,以使fprintf正常工作。

有办法做到这一点吗?是否有更好的方法让fprintf按照我的意愿行事?

1 个答案:

答案 0 :(得分:2)

你非常接近。我要做的是更改cellfun调用,以便输出是单元格数组而不是数字数组。使用“UniformOutput'标志并将其设置为0或false。

完成后,创建一个新的单元格数组,其中名称单元格数组和大小单元格数组相互堆叠。然后,您可以拨打fprintf一次。

% Save the names in a cell array
A = {myStructure.name};

% Save the sizes in another cell array
B = cellfun(@numel, {myStructure.data}, 'UniformOutput', 0);

% Create a master cell array where the first row are the names
% and the second row are the sizes
out = [A; B];

% Print out the elements side-by-side
fprintf('%s\t%d\n', out{:});

使用第三行代码的技巧是,当您使用{:}展开单元格数组时,会创建以 column-major 格式展开的以逗号分隔的列表,这样做out{:}实际上会给你:

A{1}, B{1}, A{2}, B{2}, ..., A{n}, B{n}

...提供您需要的交错。因此,将此订单提供到fprintf与指定的格式说明符一致,从而为您提供所需的内容。这就是为什么堆叠单元格数组以便每列都能提供所需信息的重要性。

次要注意事项

当然,人们永远不应忘记解决问题的最简单方法之一就是使用简单的for循环。尽管for循环被认为是不好的做法,但它们的表现在整个MATLAB的发展过程中已经走过了漫长的道路。

简单地说,就这样做:

for ii = 1 : numel(myStructure)
    fprintf('%s\t%d\n', myStructure(ii).name, numel(myStructure(ii).data));
end

与我们上面使用单元格数组所做的相比,上面的代码可以说更具可读性。您是直接访问结构而不是为了调用fprintf一次创建中间变量。

运行示例

以下是此次运行的示例。使用下面显示的数据:

clear myStructure;
myStructure(1).name = 'hello';
myStructure(1).data = rand(5,1);
myStructure(2).name = 'hi';
myStructure(2).data = zeros(3,3);
myStructure(3).name = 'huh';
myStructure(3).data = ones(6,4);

运行打印代码后,我得到以下输出:

hello   5
hi  9
huh 24

我们可以看到尺寸是正确的,因为结构中的第一个元素只是一个随机的5元素向量,第二个元素是3 x 3 = 9个零的矩阵,而最后一个元素是6 x 4 = 24个基质