我有一个矢量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]
该数据是通过编码17个值来生成的,这些值分开12或13个数字(例如25-13 = 12,38-25 = 13等)。你会看到前17个值遵循这种模式。每组17个值编码一个对象,我们将其称为“项目”,并且与后续的17个值无关。然后,在值17和18之间,存在比12或13大得多的差异,但它可以是高于15的任何数字。这种差异表示数据中的分离定性分离,使得前17个值编码一个项目,接下来的17个值会编码另一个项目等等。第17个和第18个值之间的差异永远不会小到12或13.因此,我可以检查任何值> = 15,并确保我可以分开我这样的数据。或者,我可以将矢量重新整形为17xlength(stdclock)/ 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]
此stdclock与顶部的stdclock相同,但我在第二项中进行了随机删除的数字,包括第一个和最后一个数字。
答案 0 :(得分: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