什么时候使用单元阵列与Matlab中的结构是否合适?
如果我想存储在一个变量的一些字符串或者不同尺寸的矩阵,我能想到的两种选择:我可以做一个结构数组,有领域之一保存数据,什么时候使用单元阵列与Matlab中的结构是否合适?
structArray(structIndex).structField
或我可以使用单元阵列,
cellArray{cellIndex}
但是,有什么时候使用哪种数据结构的一般规则?我想知道在某些情况下是否存在使用其中一个或另一个的缺点。
在我看来,这更多的是方便和代码清晰的问题。问问自己,你是否愿意通过数字或名称来引用可变元素。然后使用前一种情况下的单元格数组和稍后的结构数组。想想看,如果你有一张带有和不带标题的表格。
顺便说一下,您可以轻松地使用CELL2STRUCT和STRUCT2CELL函数在结构和单元格之间进行转换。
如果你在一个函数中使用它进行计算,我建议你使用单元阵列,因为它们更方便处理,到CELLFUN。但是,如果你使用它来存储数据(和返回输出),最好返回结构,因为字段名称是(应该)自我记录的,所以你不需要记住你有什么信息在你的单元格阵列的第7列。另外,如果需要,您可以在结构中轻松地添加一个字段“帮助”,您可以在其中添加字段的其他解释。
结构对于数据存储也很有用,因为如果您想在以后更新代码,可以将它们替换为对象而无需更改代码(至少在您预先分配了结构的情况下)。它们具有相同的sytax,但对象允许您添加更多功能,例如依赖属性(即基于其他属性即时计算的属性)。
最后,请注意,单元格和结构会为每个字段添加几个字节的开销。因此,如果要使用它们来处理大量数据,则最好使用包含数组的结构/单元格,而不要使用大型数组结构/单元格,其中字段/元素只包含标量。
首先,我第二个yuk的答案。从长远来看,清晰度通常更重要。
但是,您可能有两个更多的选择取决于如何形状不规则的数据是:
方案3:structScalar.structField(fieldIndex)
方案4:structScalar.structField{cellIndex}
在这四种,#3具有最少大量元素的内存开销(它将矩阵的总数最小化),大数目我的意思是> 100,000。如果你的代码适合在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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
对于单元阵列,您需要一些元数据来识别单元格内容。仔细选择字段名称使您的代码自我解释。 – zellus 2010-09-03 16:55:39