확인하십시오 MATLAB에서 구조체의 배열을 초기화하는 방법?




메모리가 부족합니다. help memory 명령을 입력해 옵션을 확인하십시오. (5)

repmat 사용하는 것은 구조체를 미리 할당하는 가장 효율적인 방법입니다.

N = 10000;    
b = repmat(struct('x',1), N, 1 );

Matlab 2011a를 사용하면 인덱스를 통해 사전 할당하는 것보다 ~ 10 배 빠릅니다 .

N      = 10000;
b(N).x = 1

인덱싱 방법은 미리 할당하지 않는 것보다 약간 빠릅니다.

No preallocation:            0.075524    
Preallocate Using indexing:  0.063774
Preallocate with repmat:     0.005234

확인하려는 경우 아래 코드를 입력하십시오.

        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
        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)])
No preallocation:        0.075524    
Preallocate Indexing:    0.063774
Preallocate with repmat: 0.0052338
>> 

추신 : 나는 왜 이것이 사실인지, 누군가가 설명 할 수 있는지 알고 싶다.

MATLAB에서 구조체의 배열을 미리 할당하려면 어떻게해야합니까? 이 예제에서 "a"를 미리 할당하여 여러 번 크기가 조정되지 않도록하려고합니다.

a = []
for i = 1:100
  a(i).x = i;
end

이 대답 에 따르면, 또 다른 방법이 있습니다 :

[a.x] = deal(val);

여기서 val 은 구조체의 모든 요소에 지정하려는 값입니다.

이 명령의 효과는 다른 구조의 효과와 다릅니다. 모든 구조체 a 모든 x 필드에 val 값이 할당됩니다.


구조체의 배열을 미리 할당하는 대신 루프를 뒤집기가 더 쉬울 수도 있습니다. 이 방법으로 배열은 첫 번째 반복에서 할당되고 나머지 반복은 구조체를 채우는 데 사용됩니다.

a = []
for i = 100:-1:1
    a(i).x = i;
end

구조를 초기화 할 수있는 방법은 여러 가지가 있습니다. 예를 들어, struct 명령을 사용할 수 있습니다.

a(1:100) = struct('x',[]);

모든 필드 x 를 공백으로 설정합니다.

어떤 데이터가 거기에 들어가야하는지 알고있는 경우 deal 을 사용하여 구조를 만들고 채울 수도 있습니다.

xx = num2cell(1:100);
[a(1:100).x]=deal(xx{:});
a(99).x
ans =
    99

또는 struct 다시 사용할 수 있습니다 ( struct 필드가 셀 배열이어야하는 경우 셀을 중괄호로 묶어야 함).

a = struct('x',xx)

이것이 이루어져야하고 가장 단순한 방법입니다.

a=struct('x',cell(1,N));

누락 된 "tic"을 수정하고이 방법을 jerad가 제시 한 벤치마킹 코드에 추가하면 위에서 제안한 방법은 repmat보다 조금 느리지 만 구현하기가 훨씬 간단합니다. 여기 출력이 있습니다.

No preallocation:        0.10137
Preallocate Indexing:    0.07615
Preallocate with repmat: 0.01458
Preallocate with struct: 0.07588

repmat이 빠르다는 이유는 각 'x'필드의 값이 사전 할당 중에 배정되기 때 문에 비워두기 때문입니다. 위의 사전 할당 기법이 변경되었으므로 다음과 같이 할당 된 값 (1)이있는 모든 x 필드부터 시작합니다.

    a=cell(1,N);
    a(:)={1};
    d=struct('x',a);

그런 다음 벤치마킹이 많이 개선되고 repmat보다 매우 가깝거나 빠릅니다. 그 차이는 너무 작아서 실행할 때마다 어느 것이 더 빠릅니까? 다음은 출력 예제입니다.

No preallocation:        0.0962
Preallocate Indexing:    0.0745
Preallocate with repmat: 0.0259
Preallocate with struct: 0.0184

반대로 repmat 사전 할당을 변경하여 필드를 비워두면

b = repmat( struct( 'x', {} ), N, 1 );

모든 속도 이점은 손실됩니다.







matlab