在命令窗口中打印进度

Posted

技术标签:

【中文标题】在命令窗口中打印进度【英文标题】:Printing progress in command window 【发布时间】:2016-08-17 15:23:05 【问题描述】:

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

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

name1    number1
name2    number2
name3    number3
name4    number4
...

我可以将repmatfprintf 一起使用N 次。问题是所有数字都必须在单元格数组C 中的名称之间。

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

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

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

但是,我不确定如何将其放入具有交替元素的单元格数组中以供 C 使用,以使 fprintf 工作。

有没有办法做到这一点?有没有更好的方法让fprintf 表现得如我所愿?

【问题讨论】:

请提供具有代表性的数据集和所需的输出,我不知道您要完成什么。假设您在处理这些内容时打印它们,如果您正在打印进度,为什么需要repmat 发布问题后,我可以看到它是如何令人困惑的。我将编辑我的问题。 别叫它struct,因为这是创建结构的命令 当然,我的错误,匆忙写了这个,它溜过了我的 MATLAB 感官。现在应该编辑。 【参考方案1】:

你很亲密。我要做的是更改您的 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 格式展开的逗号分隔列表,@987654326 也是如此@其实给了你:

A1, B1, A2, B2, ..., An, Bn

... 它提供了您需要的交错。因此,将此顺序提供给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 个矩阵。

【讨论】:

啊,当然,A: 的输出也会占用剩余的行,这正是我想要的!另外,请原谅我可怕的命名选择,这只是一个误会,因为没有一个变量名来自我的原始代码,所以我只是快速写了一些东西。如果您可以从您的答案中编辑它,那将非常感激,因为我很尴尬。当然留下它让我想起了耻辱,所以也许这也是一个很好的提醒:) @Jens 我很乐意效劳 :) 现在让我编辑它。没有什么可尴尬的。一点也不。我向您保证,几乎每个 MATLAB 程序员都在不经意间执行过这种遮盖工作……在他们的一生中至少一次。我刚刚学会了确保我永远不会这样做,因为这肯定让我在@$$ 之前受到过伤害。

以上是关于在命令窗口中打印进度的主要内容,如果未能解决你的问题,请参考以下文章

在控制台中打印特殊字符 (C++/C#/SWIG)

关于cad打开一张图纸,卡在进度条99%就不动了,下面的命令卡在如图所示。

python 进度条

使用进度在 Windows 命令行上复制文件

winform 实现单击按钮后显示进度条或等待窗口

其他打印报表中的进度条不起作用 - 找不到有用的进度条