我们肯定知道最后一个元素必须是 11,所以我们已经可以检查这一点,并使我们的生活更容易测试所有以前的元素。我们确保它A
是 11 终止的,因此“逐元素更改”方法(如下)将是有效的。请注意,一开始也是如此,但是更改A
索引会弄乱索引,因此我们最好稍后再处理。
missing = [];
if A(end) ~= 11
missing = [missing; 11, length(A) + 1];
A = [A, 11];
end
然后我们可以计算dA = A(2:end) - A(1:end-1);
从一个元素到另一个元素的变化,并确定间隙位置idx_gap = find((dA~=1) & (dA~=-11));
。现在我们需要扩展所有缺失的索引和期望值,使用ev
期望值。ev
可以从先前的值中获得,如
for k = 1 : length(idx_gap)
ev = A(idx_gap(k));
现在,要填充的元素数量是dA
该位置的变化减去一(因为一意味着没有间隙)。请注意,如果段之间的边界处存在间隙,则可以覆盖,因此我们使用模数。
for n = 1 : mod(dA(idx_gap(k)) - 1, 12)
ev = mod(ev + 1, 12);
missing = [missing; ev, idx_gap(k) + 1];
end
end
作为测试,考虑 A = [5 6 7 8 9 10 3 4 5 6 7 8 9 10 11 0 1 2 3 4 6 7 8]。在这种情况下,从一开始的特殊初始化就会触发,已经记住了丢失的 11,并将 A 更改为 [5 6 ... 7 8 11]。missing
然后将产生
11 24 % recognizes improper termination of A.
11 7
0 7 % properly handles wrap-over here.
1 7
2 7
5 21 % recognizes single element as missing.
9 24
10 24
这应该是您所期望的。现在缺少的仍然是 的开头A
,所以让我们说missing = [0 : A(1) - 1, 1; missing];
完成列表。