我一直在试图优化需要处理很长数组的matlab脚本。
基本上,有2个数组:AbsoluteTimeTag
和Channel
。
AbsoluteTimeTag
将保存int值,表示使用16位计数器记录的时间。由于计数器限于2 ^ 16个值,因此在测量过程中通常会翻转。 Channel
注册了这个,当它发生时,bitand(Channel,2048)
将评估为真。
如何生成这些数组是我无法控制的,溢出标记与进入的数据“同步”。
现在可以通过以下方式轻松重建绝对时间:
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;
我一直非常关注如何对此进行矢量化(因为Matlab在循环中非常糟糕)。然而到目前为止,由于某种原因,我没有看到光。
问题是,当你从向导走到最后时,向AbsoluteTimeTag
的某个记录索引的溢出次数可能会发生变化。
我不知道如何在向量操作中表达“计算所有出现溢出的情况”。
有人可以评论这是否可行?
修改
示例数据如下所示:
TimeTag(为简单起见,每个元素都是一个为2 ^ 3寄存器计算时间的事件):
[ 01 03 04 07 xx 02 03 04 05 xx 01 03 04 07 xx ... ]
溢出:
[ 00 00 00 00 01 00 00 00 00 01 00 00 00 00 01 ... ]
哪个需要产生
[ 01 03 04 07 xx 10 11 12 13 xx 17 19 20 23 xx ... ]
xx的原因是因为最初所有记录,事件和溢出都在一个大的uint32数组中,其中每个记录在不同的位上保存不同类型的信息。 xx位置可以进行任何操作,但在考虑TimeTag记录时它们更无意义。我有一个逻辑数组,可以跟踪哪些位置包含实际有意义的数据。
答案 0 :(得分:1)
"count all occurrences of ... to this point" in a vectored operation
最好表示为 cumsum
。
假设NoOfOverflows
在循环开始之前初始化为零且AbsoluteTimeTag
,Timetag
有NumberOfRecords
作为元素数量,请查看这是否适合您 -
%// 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);