matlab - 행렬 - 메모리가 부족합니다. help memory 명령을 입력해 옵션을 확인하십시오.




MATLAB에서 구조체의 배열을 초기화하는 방법? (4)

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

a = []
for i = 1:100
  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 = []
for i = 100:-1:1
    a(i).x = i;
end

Loren의 MATLAB 블로그 아트에 대한 좋은 토론이 있습니다.

만약 내가 올바르게 이해한다면, 원하는 구조체를 초기화하는 방법이있다.

a(100).x = 100;

이 메서드를 사용하면 요소가 빈 배열로 채워지는 것을 알 수 있습니다.


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