Arrays 什么时候在Matlab中使用单元数组和结构比较合适?
如果我想在一个变量中存储一些大小不同的字符串或矩阵,我可以考虑两个选项:我可以制作一个结构数组,让其中一个字段保存数据Arrays 什么时候在Matlab中使用单元数组和结构比较合适?,arrays,matlab,struct,cell,Arrays,Matlab,Struct,Cell,如果我想在一个变量中存储一些大小不同的字符串或矩阵,我可以考虑两个选项:我可以制作一个结构数组,让其中一个字段保存数据 structArray(structIndex).structField 或者我可以用一个细胞阵列 cellArray{cellIndex} 但是,对于何时使用哪种数据结构,是否有一般的经验法则?我想知道在某些情况下使用一种或另一种是否有缺点。在我看来,这更多是一个方便和代码清晰的问题。问问你自己,你更喜欢用数字还是名字来引用你的变量元素。然后在前一种情况下使用单元数组,在
structArray(structIndex).structField
或者我可以用一个细胞阵列
cellArray{cellIndex}
但是,对于何时使用哪种数据结构,是否有一般的经验法则?我想知道在某些情况下使用一种或另一种是否有缺点。在我看来,这更多是一个方便和代码清晰的问题。问问你自己,你更喜欢用数字还是名字来引用你的变量元素。然后在前一种情况下使用单元数组,在后一种情况下使用结构数组。想象一下,就像您有一个有标题和没有标题的表一样
顺便说一句,您可以使用and函数轻松地在结构和单元格之间进行转换。如果您在函数中使用它进行计算,我建议您使用单元格数组,因为它们更便于处理,这要归功于 但是,如果您使用它来存储数据(并返回输出),最好返回结构,因为字段名(应该)是自记录的,所以您不需要记住单元格数组第7列中的信息。此外,您可以很容易地在结构中包含一个字段“帮助”,如有必要,您可以在该字段中添加一些额外的解释 结构对于数据存储也很有用,因为如果您想在以后更新代码,可以使用对象替换它们,而无需更改代码(至少在您预先分配结构的情况下)。它们具有相同的sytax,但对象将允许您添加更多功能,例如从属属性(即基于其他属性动态计算的属性)
最后,请注意,单元格和结构会给每个字段增加一些字节的开销。因此,如果您想使用它们处理大量数据,最好使用包含数组的结构/单元格,而不是字段/元素仅包含标量的大型结构/单元格数组 首先,我支持yuk的回答。从长远来看,清晰度通常更为重要 但是,根据数据形状的不规则程度,您可能还有两个选择: 选项3:
structScalar.structField(fieldIndex)
选项4:structScalar.structField{cellIndex}
在这四种方法中,#3对于大量元素的内存开销最小(它使矩阵的总数最小化),我所说的大数是指>100000。如果您的代码适合在
structField
上进行矢量化,那么这可能也是一个性能胜利。如果无法将structField
的每个元素收集到一个矩阵中,则选项4具有符号优势,而没有选项3的内存和性能优势。这两个选项都使在整个数据集上使用arrayfun或cellfun变得更容易,而代价是需要您分别从每个字段添加或删除元素。选择取决于您如何使用数据,这让我们回到yuk的答案——选择最清晰的代码。这段代码表明,单元格数组的赋值和检索速度大约是结构的两倍。我没有将这两项行动分开。可以很容易地修改代码来实现这一点
之后运行“whos”表明它们使用的内存量非常相似
我的目标是用python术语制作一个“列表列表列表”。也许是一个“数组数组”
我希望这是有趣/有用的
%%%%%%%%%%%%%% StructVsCell.m %%%%%%%%%%%%%%%
clear all
M = 100; % number of repetitions
N = 2^10; % size of cell array and struct
for m = 1:M
% Fill up a template cell array with
% lists of randomly sized matrices with
% random elements.
template{N} = 0;
for n = 1:N
r1 = round(24*rand());
r2 = round(24*rand());
r3 = rand(round(r2*rand),round(r1*rand()));
template{N} = r3;
end
% Make a cell array equivalent
% to the template.
cell_array = template;
% Create a struct with the
% same data.
structure = struct('data',0);
for n = 1:N
structure(n).data = template{n};
end
% Time cell array
tic;
for n = 1:N
data = cell_array{n};
cell_array{n} = data';
end
cell_time(m) = toc;
% Time struct
tic;
for n = 1:N
data = structure(n).data;
structure(n).data = data';
end
struct_time(m) = toc;
end
str = sprintf('cell array: %0.4f',mean(cell_time));
disp(str);
str = sprintf('struct: %0.4f',mean(struct_time));
disp(str);
str = sprintf('struct_time / cell_time: %0.4f',mean(struct_time)/mean(cell_time));
disp(str);
% Check memory use
whos
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
对于单元格数组,您需要一些元数据来识别单元格内容。精心选择的字段名称使您的代码能够自我解释。哦,谢谢@jonas告诉我有关CELLFUN的事情。我不知道该函数,将在我正在编写的代码中使用它。根据您的代码,在我的情况下,struct的速度是struct的四倍