循环的Matlab矢量化"跟踪值增量"

时间:2014-09-25 09:31:21

标签: matlab for-loop vectorization

我一直在试图优化需要处理很长数组的matlab脚本。

基本上,有2个数组:AbsoluteTimeTagChannel

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记录时它们更无意义。我有一个逻辑数组,可以跟踪哪些位置包含实际有意义的数据。

1 个答案:

答案 0 :(得分:1)

"count all occurrences of ... to this point" in a vectored operation最好表示为 cumsum

假设NoOfOverflows在循环开始之前初始化为零且AbsoluteTimeTagTimetagNumberOfRecords作为元素数量,请查看这是否适合您 -

%// 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);