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的四倍