2016-06-28 2 views
1

필드 크기가 가변적 인 경우 구조체 배열을 미리 할당하려고 시도 할 때 값이 있습니까? 예를 들면 다음과 같습니다.알 수없는 길이 필드가있는 구조체 배열 초기화

A.x = randn(1,randi(100)); 
A.y = randn(1,randi(100)); 

for k = 2:1000 
    A(k).x = randn(1,randi(100)); 
    A(k).y = randn(1,randi(100)); 
end 

첫 번째 항목을 만든 다음 repmat을 사용할 수 있지만 MATLAB은 알 수없는 필드 길이를 처리해야합니다. 내 테스트에서는 동적으로 성장시키는 것과 비교하여 거의 개선되지 않았습니다. 부수적으로 괄호 (예 : A = [A nextEntry])로 성장시키는 것은 훨씬 느립니다.

속도를 높이기 위해 사전 할당을 수행하는 영리한 방법이 있습니까?

+0

아마도이 게시물이 도움이 될 것입니다 : http://stackoverflow.com/questions/28664640/matlab-vectorization-filling-struct-fields-from-vector-elements – rayryeng

+0

당신은 * 값 *을 초기화 할 필요가 없습니다. 필드들뿐입니다. 값은 메모리의 다른 위치에 저장됩니다. – Suever

답변

1

MATLAB이 struct 어레이를 저장하는 방식은 구조체 (치수, 필드 이름 등)에 대한 메타 데이터가 메모리의 한 위치에 저장되고 각 필드의 내용 (값)이 별도로 저장된다는 것입니다. 위치에 대한 포인터는 요청시 찾을 수 있도록 메타 데이터에 삽입됩니다. 이러한 이유로

, 당신은 []에 당신은 모든 내용으로 초기화 할 수있는 struct에게 설정을 초기화합니다. 필드 수와 초기 크기 인 struct이 올바른 크기인지 확인하여 결국에는 포함 할 데이터에 대한 모든 포인터를 저장할 충분한 공간을 확보해야합니다.

그런 다음 필요에 따라 필드를 채울 수 있으며, 해당 값은 새 메모리에 할당되며 해당 포인터는 사전 할당 된 위치의 메타 데이터에 저장됩니다.

A relevant article from Loren's blog

그래서 귀하의 경우에 당신은 단순히 미리 할당 할 수 struct과 : [A newA]를 사용 A 성장 이유 마찬가지로 지금까지

for k = 1:numel(A) 
    A(k).x = randn(1, randi(100)); 
    A(k).y = randn(1, randi(100)); 
end 

:

A = struct('x', cell(1, 1000), 'y', cell(1, 1000)); 

그리고 그것을 채울 느립니다. 이로 인해 매번 루프를 통해 매번 struct의 메타 데이터 구성 요소를 "성장"시켜야합니다. 실제로는 매번 확장을 수행하기 위해 메타 데이터의 전체 복사본을 만들어야합니다.

+0

답장을 보내 주셔서 감사합니다. MATLAB이 어쨌든 내용에 대한 기억을 찾아야 할 때, 내 질문의 일부는 "왜 귀찮은가"라고 생각합니다. 포인터에 대한 공간을 미리 할당 할 수 있지만 포인터는 대형 배열 일 수 있으므로 실시간으로 처리해야합니다. 아니면 내가 잘못 했니? – user2364295

+0

@ user2364295 포인터 (메타 데이터에 저장 됨)는 포인터가 가리키는 데이터의 크기에 관계없이 같은 크기입니다. 이러한 모든 포인터에 대한 공간을 미리 저장하지 않으면 MATLAB은 새 요소를 추가 할 때마다 메타 데이터를 * 이동 *해야합니다 (그렇게하면 성능에 영향을 미쳤습니다). 그리고 예, 데이터를 할당 할 때 해당 항목에 대한 데이터를 할당해야하지만 전체 메타 데이터 구조를 다시 할당해야하는 필요성을 추가하지 않으려합니다. 사전에 사전 할당 시간을 미리 저장하지 마십시오. – Suever