如何在MATLAB中初始化结构数组?

Moh*_*imi 45 matlab

如何在MATLAB中预分配结构数组?我想在此示例中预先分配"a",以便它不会多次调整大小.

a = []
for i = 1:100
  a(i).x = i;
end
Run Code Online (Sandbox Code Playgroud)

jer*_*rad 73

repmat到目前为止,使用是预分配结构的最有效方法:

N = 10000;    
b = repmat(struct('x',1), N, 1 );
Run Code Online (Sandbox Code Playgroud)

这是〜10倍的速度更快用Matlab 2011A不是通过索引预分配,如

N      = 10000;
b(N).x = 1
Run Code Online (Sandbox Code Playgroud)

索引方法仅比不预分配快一点.

No preallocation:            0.075524    
Preallocate Using indexing:  0.063774
Preallocate with repmat:     0.005234
Run Code Online (Sandbox Code Playgroud)

如果您想验证,请在下面编写代码.

        clear;
        N = 10000;

    %1) GROWING A STRUCT
        tic;
        for ii=1:N
            a(ii).x(1)=1;    
        end
        noPreAll = toc;        

    %2)PREALLOCATING A STRUCT
        tic;
        b = repmat( struct( 'x', 1 ), N, 1 );
        for ii=1:N
            b(ii).x(1)=1;    
        end;  
        repmatBased=toc;        

    %3)Index to preallocate
        tic;
        c(N).x = 1;
        for ii=1:N
            c(ii).x(1)=1;    
        end;  
        preIndex=toc;

        disp(['No preallocation:        ' num2str(noPreAll)])            
        disp(['Preallocate Indexing:    ' num2str(preIndex)])
        disp(['Preallocate with repmat: ' num2str(repmatBased)])
Run Code Online (Sandbox Code Playgroud)

PS 我有兴趣知道为什么这是真的,如果有人能解释的话.

  • 你的基准测试中有一个错误:在初始化c之前没有"tic"(尽管在你的情况下没有太大的区别,因为2比3快得多).然而,在某些版本的Matlab(例如2010)中,似乎2)和3)需要相同的时间,不确定在较新版本中有什么变化. (6认同)

bla*_*bla 11

在Loren on the MAT of MATLAB博客上有一个很好的讨论.

如果我理解正确,这里有一种方法来初始化你想要的结构:

a(100).x = 100;
Run Code Online (Sandbox Code Playgroud)

使用此方法,我们可以看到元素用空数组填充.


Jon*_*nas 11

您可以通过多种方式初始化结构.例如,您可以使用以下struct命令:

a(1:100) = struct('x',[]);
Run Code Online (Sandbox Code Playgroud)

将所有字段设置x为空.

deal如果您知道哪些数据应该在那里,您还可以使用创建和填充结构

xx = num2cell(1:100);
[a(1:100).x]=deal(xx{:});
a(99).x
ans =
    99
Run Code Online (Sandbox Code Playgroud)

或者你可以struct再次使用(注意,如果结构的一个字段应该是一个单元格数组,那么单元格需要用大括号括起来!)

a = struct('x',xx)
Run Code Online (Sandbox Code Playgroud)