2010-09-03 101 views
17

如果我想存储在一个变量的一些字符串或者不同尺寸的矩阵,我能想到的两种选择:我可以做一个结构数组,有领域之一保存数据,什么时候使用单元阵列与Matlab中的结构是否合适?

structArray(structIndex).structField 

或我可以使用单元阵列,

cellArray{cellIndex} 

但是,有什么时候使用哪种数据结构的一般规则?我想知道在某些情况下是否存在使用其中一个或另一个的缺点。

回答

15

在我看来,这更多的是方便和代码清晰的问题。问问自己,你是否愿意通过数字或名称来引用可变元素。然后使用前一种情况下的单元格数组和稍后的结构数组。想想看,如果你有一张带有和不带标题的表格。

顺便说一下,您可以轻松地使用CELL2STRUCTSTRUCT2CELL函数在结构和单元格之间进行转换。

+4

对于单元阵列,您需要一些元数据来识别单元格内容。仔细选择字段名称使您的代码自我解释。 – zellus 2010-09-03 16:55:39

9

如果你在一个函数中使用它进行计算,我建议你使用单元阵列,因为它们更方便处理,到CELLFUN。但是,如果你使用它来存储数据(和返回输出),最好返回结构,因为字段名称是(应该)自我记录的,所以你不需要记住你有什么信息在你的单元格阵列的第7列。另外,如果需要,您可以在结构中轻松地添加一个字段“帮助”,您可以在其中添加字段的其他解释。

结构对于数据存储也很有用,因为如果您想在以后更新代码,可以将它们替换为对象而无需更改代码(至少在您预先分配了结构的情况下)。它们具有相同的sytax,但对象允许您添加更多功能,例如依赖属性(即基于其他属性即时计算的属性)。

最后,请注意,单元格和结构会为每个字段添加几个字节的开销。因此,如果要使用它们来处理大量数据,则最好使用包含数组的结构/单元格,而不要使用大型数组结构/单元格,其中字段/元素只包含标量。

2

首先,我第二个yuk的答案。从长远来看,清晰度通常更重要。

但是,您可能有两个更多的选择取决于如何形状不规则的数据是:

方案3:structScalar.structField(fieldIndex)

方案4:structScalar.structField{cellIndex}

在这四种,#3具有最少大量元素的内存开销(它将矩阵的总数最小化),大数目我的意思是> 100,000。如果你的代码适合在structField上进行矢量化,那么它也可能是性能上的胜利。如果无法将structField的每个元素收集到一个矩阵中,则选项4具有标记优点,而不具有选项3的内存优势。这两个选项都可以更轻松地在整个数据集上使用arrayfun或cellfun,需要您单独添加或删除每个字段中的元素。选择取决于你如何使用你的数据,这将我们带回到yuk的答案 - 选择最清晰的代码。

6

此代码表明单元阵列可能大约是分配和检索结构的两倍。我没有分开这两个操作。人们可以很容易地修改代码来做到这一点。

之后运行“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 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
+0

哦,谢谢@jonas告诉我关于CELLFUN。我不知道这个功能,并将在我正在处理的代码中使用它。 – abalter 2010-12-06 00:16:48

+0

根据你的代码'struct'在我的情况下快四倍 – embert 2014-08-21 14:48:15

相关问题