命令中的打印进度 window
Printing progress in command window
我想用fprintf
在命令window中显示代码执行进度。
我有一个 N x 1 结构数组,我们称它为 myStructure
。每个元素都有字段 name
和 data
。我想将 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
按照我的意愿行事?
你非常接近。我要做的是更改您的 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位矩阵。
我想用fprintf
在命令window中显示代码执行进度。
我有一个 N x 1 结构数组,我们称它为 myStructure
。每个元素都有字段 name
和 data
。我想将 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
按照我的意愿行事?
你非常接近。我要做的是更改您的 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位矩阵。