你非常接近。我会做的是改变你的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的一个矩阵。
请提供一个有代表性的数据集和所需的输出,我不知道你要完成什么。假设你在处理它们时打印这些文件,如果你正在打印进度,你为什么需要'repmat'? – excaza
发布问题后,我可以看到它可能会令人困惑。我会编辑我的问题。 – jenszvs
让我们不叫它'struct',因为这是创建结构的命令 – Finn