【发布时间】:2014-09-25 09:31:21
【问题描述】:
我一直在努力优化一个需要处理很长数组的 matlab 脚本。
基本上有 2 个数组:AbsoluteTimeTag 和 Channel。
AbsoluteTimeTag 将保存表示使用 16 位计数器记录的时间的 int 值。由于计数器限制为 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 记录时它们进一步没有意义。我有一个逻辑数组来跟踪哪些位置保存了实际有意义的数据。
【问题讨论】:
-
嗨,我最终需要计算溢出的数量。但是,如果有意义的话,我需要仅使用“直到该点”的溢出事件对时间标签数组的每个元素执行与溢出计数的乘法...我将使用示例数据修改 Q...
-
那么,对于
xx locations,AbsoluteTimeTag值将与对应的TimeTag值相同?你是说你有另一个数组告诉我们这些值是否为xx?如果是这样,那将具有与AbsoluteTimeTag和Timetag相同数量的元素,对吧? -
嗨 Divakar,确实,对于 xx 位置,我将应用相同的乘法,即 65536 * noOfOverflows(到那时)+ 16 位时间标签。基本上,这些 xx 位置保存溢出事件本身的 16 位时间标签,而其他时间标签位置是有趣事件(光子检测)的时间标签。
标签: matlab for-loop vectorization