2014-09-25 2 views
1

나는 꽤 긴 배열을 처리해야하는 MATLAB 스크립트를 최적화하려고 노력하고있다.루프 "추적 값 증분"의 Matlab 벡터화

기본적으로 배열은 AbsoluteTimeTagChannel입니다.

AbsoluteTimeTag은 16 비트 카운터를 사용하여 기록되는 시간을 나타내는 int 값을 보유합니다. 카운터는 2^16 값으로 제한되기 때문에 측정 과정에서 종종 롤오버됩니다. Channel이이를 등록하면 bitand(Channel,2048)이 true를 평가합니다. 이러한 배열이 생성되는 방법

내 통제하고 오버 플로우 마커는 데이터가 들어오는와 "동기화"발생

수행하여 절대 시간을 재구성하는 지금 간단하다.

AbsoluteTimeTag(i) = NoOfOverflows * 65536 + TimeTag(i); 
을 루프에서

:

for i=1:NumberOfRecords 

    %Running through all records, if we meet anything other than an 
    %overflow record, we van just calculate its absolute time based on 
    %current overflow count and its timetag. 
    AbsoluteTimeTag(i) = NoOfOverflows * 65536 + TimeTag(i); 

    % We are running through all records so if we encounter an overflow 
    % (signified by bitand(..., 2048), we add 1 to the overflow count. 
    if bitand(Channel(i),2048) 
     NoOfOverflows = NoOfOverflows + 1; 
    end; 
end; 

난 정말 (매트랩 루프에 아주 나쁜이기 때문에) 가능성이 벡터화하는 방법에 머리를 파괴하고있다. 그러나 지금까지는 어떤 이유로 빛을 보지 못했습니다.

AbsoluteTimeTag의 특정 레코드 인덱스까지 오버플로 횟수가 벡터를 처음부터 끝까지 이동할 때 변경 될 수있는 문제가 있습니다.

벡터 작업에서 "이 시점까지 모든 오버플로 카운트"를 어떻게 표현할 수 있는지 알 수 없습니다.

누군가가 이것이 가능할 수도 있는지 여부에 대해 의견을 개진 할 수 있습니까? 같을 것이다

EDIT

데이터 예 :

[ 01 03 04 07 xx 02 03 04 05 xx 01 03 04 07 xx ... ] 
:

TimeTag (각 요소는 시간이 간략화를 위해 해제를 2^3 레지스터 카운트되는 이벤트이다)

오버플로 :

[ 00 00 00 00 01 00 00 00 00 01 00 00 00 00 01 ... ] 

HICH는 이유 xx는 원래 모든 레코드, 이벤트 및 오버 플로우가 모두 각 레코드는 다른 비트에 대한 정보의 다른 유형을 가지고 하나 개의 큰 UINT32 배열에 있기 때문에이있다

[ 01 03 04 07 xx 10 11 12 13 xx 17 19 20 23 xx ... ] 

산출해야합니다. xx 위치는 어떤 작업을 수행 할 수 있지만 TimeTag 레코드를 고려할 때 더 의미가 없습니다. 나는 논리적 인 배열을 가지고 어떤 위치가 실제 의미있는 데이터를 보유하고 있는지 추적한다.

+0

안녕하세요 나는 결국 계산해야합니다 -이 당신을 위해 작동하는 경우 NoOfOverflows 가정

는 루프의 시작과 AbsoluteTimeTag 전에 0으로 초기화되고, Timetag 요소들의 숫자로 NumberOfRecords를 참조하십시오 오버플로 횟수. 그러나, 오버플로 발생을 사용하여 시간 태그 배열의 각 요소에 대한 오버플로 계수를 곱셈을 수행해야합니다. "그 점까지"어떤 식 으로든 말하면 ... Q를 예제 데이터로 수정합니다 ... – Kris

+0

그래서'xx locations '의 경우'AbsoluteTimeTag '값은 해당'TimeTag '값과 같습니다. 그리고 값이'xx'인지 아닌지를 알려주는 또 다른 배열을 가지고 있다고 말하는 것입니까? 그렇다면 'AbsoluteTimeTag'및 'Timetag'와 같은 수의 요소가 생깁니다. 맞습니까? – Divakar

+0

안녕하세요 Divakar, 실제로 xx 위치의 경우 똑같은 곱셈을 적용합니다. 즉, 65536 * noOfOverflows (최대 지점까지) + 16 비트 시간표가 적용됩니다. 기본적으로 이러한 xx 위치는 오버플로 이벤트 자체의 16 비트 시간 태그를 보유하지만 다른 시간 태그 위치는 흥미로운 이벤트 (광자 감지)의 시간 태그입니다. – Kris

답변

1

"count all occurrences of ... to this point" in a vectored operation은 으로 가장 잘 표현 될 수있다.

%// Get the overflow for all Channel entries in one go 
bitand_all = bitand(Channel,2048)~=0; 

%// AbsoluteTimeTag appears to be a cumsum of overflows plus Timetag 
AbsoluteTimeTag = [0 ; cumsum(bitand_all(1:end-1).*65536)]+ TimeTag; 

%// Get the count of overflows as NoOfOverflows 
NoOfOverflows = sum(bitand_all); 
+0

나는 cumsum의 존재를 알지 못했다. .. 때때로이 물건들은 나를 완전히 벗어난다. 나는 이것을 조사 할 것이다. 이미 제안을 주셔서 감사합니다. – Kris

+0

@Kris 그럼,'xx' 위치 것들에 대해, 이것을 'AbsoluteTimeTag (logical_array_xx_locations) = TimeTag'에 추가해야합니다.'logical_array_xx_locations'는'xx' 위치에 1을 갖는 논리적 배열이고, 그렇지 않으면 0으로 설정됩니다 . – Divakar

+1

안녕하세요 Divakar, 솔루션은 매력처럼 작동했습니다 (xx 것은 중요하지 않음). 코드의 출력은 Q의 루프와 동일합니다. 많은 감사합니다. 선생님! :) 하나의 작은 발언 :'+ TimeTag'을 합계 할 수 있기 위해 TimeTag 자체가 uint32 였기 때문에 + 앞에 오는 배열을 uint32로 캐스팅해야했습니다. 어쨌든, 어떤 경우에는 Matlab의 간결함에 놀라지 않을 수 없습니다. 루프는 끔찍하지만 벡터화는 아주 빠를 수 있습니다. – Kris