1

我有一个向量,stdclock,它保存遵循这种模式的值:

stdclock=[13 25 38 50 63 75 88 100 113 125 138 150 163 175 188 200 213 2517 2529 2542 2554 2567 2579 2592 2604 2617 2629 2642 2654 2667 2679 2692 2704 2717]

该数据是通过对相隔 12 或 13 个数字的 17 个值进行编码生成的(例如 25-13=12、38-25 = 13 等)。您会看到前 17 个值遵循此模式。每组 17 个值编码一个对象,我们将其称为“项目”,并且独立于随后的 17 个值。然后,在值 17 和 18 之间,存在比 12 或 13 大得多的差异,但它可以是任何高于 15 的数字。这种差异表示数据中的分离定性分离,使得前 17 个值编码一个项目,接下来的 17 个值编码另一个项目,等等。第 17 个和第 18 个值之间的差异永远不会像 12 或 13 一样小。因此,我可以检查任何值 >= 15,并确保我可以将我的这样的数据。或者,

到现在为止还挺好。问题是这个向量是通过硬件生成的,有时可能会出现错误,以至于一个或多个值被简单地丢弃而不被记录。我想找出一种算法来检测“项目”中缺少值,然后从该项目中删除所有剩余值。

我无法完全理解如何以适用于所有错误模式的方式执行此操作(例如,如果一个项目可以在任何地方以任何模式缺少数字,并且相邻项目也可能在任何地方的任何地方都缺少数字模式,或无处)。

任何帮助,将不胜感激。“损坏”项目的示例如下

stdclock=[13 25 38 50 63 75 88 100 113 125 138 150 163 175 188 200 213 2529 2542 2554 2567 2579 2592 2604 2642 2654 2679 2692 2704]

这个 stdclock 与上面的相同,但我在第二项中进行了检查并随机删除了数字,包括第一个和最后一个数字。

4

1 回答 1

2

如果您可以假设连续组之间的差异总是大于某个阈值,则可以使用以下方法:识别连续组,并丢弃所有长度小于 17 的组。结果是新组的阈值可以设置为低至 15,因为丢失的数据点会将一组 17 分成两个较短的组,然后将它们都删除。

stdclock=[13 25 38 50 63 75 88 100 113 125 138 150 163 175 188 200 213 2529 2542 2554 2567 2579 2592 2604 2642 2654 2679 2692 2704];

%# a difference of more than groupDelta indicates a new (pseudo-)group
groupDelta = 15; 
groupJump = [1 diff(stdclock) > groupDelta];

%# number the groups
groupNumber = cumsum(groupJump);

%# count, for each group, the numbers. 
groupCounts = hist(groupNumber,1:groupNumber(end));

%# if a group contains fewer than 17 entries, throw it out
badGroup = find(groupCounts < 17);
stdclock(ismember(groupNumber,badGroup)) = [];


stdclock =
    13    25    38    50    63    75    88   100   113   125   138   150   163   175   188   200   213
于 2012-08-12T23:47:03.047 回答