나는 꽤 긴 배열을 처리해야하는 MATLAB 스크립트를 최적화하려고 노력하고있다.루프 "추적 값 증분"의 Matlab 벡터화
기본적으로 배열은 AbsoluteTimeTag
및 Channel
입니다.
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 레코드를 고려할 때 더 의미가 없습니다. 나는 논리적 인 배열을 가지고 어떤 위치가 실제 의미있는 데이터를 보유하고 있는지 추적한다.
안녕하세요 나는 결국 계산해야합니다 -이 당신을 위해 작동하는 경우
NoOfOverflows
가정는 루프의 시작과
AbsoluteTimeTag
전에 0으로 초기화되고,Timetag
요소들의 숫자로NumberOfRecords
를 참조하십시오 오버플로 횟수. 그러나, 오버플로 발생을 사용하여 시간 태그 배열의 각 요소에 대한 오버플로 계수를 곱셈을 수행해야합니다. "그 점까지"어떤 식 으로든 말하면 ... Q를 예제 데이터로 수정합니다 ... – Kris그래서'xx locations '의 경우'AbsoluteTimeTag '값은 해당'TimeTag '값과 같습니다. 그리고 값이'xx'인지 아닌지를 알려주는 또 다른 배열을 가지고 있다고 말하는 것입니까? 그렇다면 'AbsoluteTimeTag'및 'Timetag'와 같은 수의 요소가 생깁니다. 맞습니까? – Divakar
안녕하세요 Divakar, 실제로 xx 위치의 경우 똑같은 곱셈을 적용합니다. 즉, 65536 * noOfOverflows (최대 지점까지) + 16 비트 시간표가 적용됩니다. 기본적으로 이러한 xx 위치는 오버플로 이벤트 자체의 16 비트 시간 태그를 보유하지만 다른 시간 태그 위치는 흥미로운 이벤트 (광자 감지)의 시간 태그입니다. – Kris