2016-08-17 121 views
0

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

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

name1 number1 
name2 number2 
name3 number3 
name4 number4 
... 

我可以使用repmatÑfprintf沿。问题在于所有数字都必须在单元阵列中的名称之间出现C

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

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

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

但是我不知道如何与交替的元素得到这个成单元阵列C使fprintf工作。

有没有办法做到这一点?有没有更好的方式让fprintf按照我的愿望行事?

+0

请提供一个有代表性的数据集和所需的输出,我不知道你要完成什么。假设你在处理它们时打印这些文件,如果你正在打印进度,你为什么需要'repmat'? – excaza

+0

发布问题后,我可以看到它可能会令人困惑。我会编辑我的问题。 – jenszvs

+1

让我们不叫它'struct',因为这是创建结构的命令 – Finn

回答

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{:}); 

与代码的第三行的诀窍是,当你解开使用{:}单元阵列,这在列重大格式展开逗号分隔的列表,这样做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的一个矩阵。

+0

啊,当然,输出到'A {:}'也会把剩余的行做到我想要的!另外,请原谅我可怕的命名选择,这只是一个简单的想法,因为没有任何变量名称来自我的原始代码,所以我只是很快写了一些东西。如果你可以在你的答案中编辑它,那将非常值得赞赏,因为我很尴尬。当然,留下它让我想起了耻辱,所以也许这也是一个很好的提醒:) – jenszvs

+0

@Jens我很乐意顺从:)让我现在编辑它。没有什么好尴尬的。一点也不。我向你保证,几乎每一个MATLAB程序员都在无意间执行了这种阴影......在他们的一生中至少有一次。我刚刚学会确保我永远不会这样做,因为这肯定让我在@ $$之前就有了。 – rayryeng