2

我有一个向量应该包含从 00 到 11 的 n 个序列

A = [00;01;02;03;04;05;06;07;08;09;10;11;00;01;02;03;04;05;06;07;08;09;10;11]

我想检查序列“00 - 11”是否始终受到尊重(没有缺失值)。

例如,如果

A =[00;01;02;  04;05;06;07;08;09;10;11;00;01;02;03;04;05;06;07;08;09;10;11] 

(在第 3 位缺少 03)对于每个缺失值,我希望将这些信息返回到另一个向量中

missing=
 [value_1,position_1;
 value_2, position_2;
 etc, etc]

你能帮助我吗?

4

3 回答 3

2

我们肯定知道最后一个元素必须是 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];完成列表。

于 2013-10-31T16:22:51.667 回答
1

这将为您提供完整序列中的缺失值及其位置:

N = 11; % specify the repeating 0:N sub-sequence
n = 3; % reps of sub-sequence
A = [5 6 7 8 9 10 3 4 5 6 7 8 9 10 11 0 1 2 3 4 6 7 8]'; %' column from s.bandara

da = diff([A; N+1]); % EDITED to include missing end
skipLocs = find(~(da==1 | da==-N));
skipLength = da(skipLocs)-1;
skipLength(skipLength<0) = N + skipLength(skipLength<0) + 1;
firstSkipVal = A(skipLocs)+1;

patchFun = @(x,y)(0:y)'+x - (N+1)*(((0:y)'+x)>N);
patches = arrayfun(patchFun,firstSkipVal,skipLength-1,'uni',false);
locs = arrayfun(@(x,y)(x:x+y)',skipLocs+cumsum([A(1); skipLength(1:end-1)])+1,...
    skipLength-1,'uni',false);

然后将它们放在一起,包括开头的任何缺失值:

>> gapMap = [vertcat(patches{:}) vertcat(locs{:})-1]; % not including lead
>> gapMap = [repmat((0 : A(1) - 1)',1,2); gapMap] %' including lead
gapMap =
     0     0
     1     1
     2     2
     3     3
     4     4
    11    11
     0    12
     1    13
     2    14
     5    29
     9    33
    10    34
    11    35

第一列包含缺失值。第二列是假设的完整序列中基于 0 的位置。

>> Afull = repmat(0:N,1,n)
>> isequal(gapMap(:,1), Afull(gapMap(:,2)+1)')
ans =
     1
于 2013-10-31T20:23:26.240 回答
0

虽然这并不能完全解决您的问题,但您可以识别缺失值或连续缺失值组的位置,如下所示:

ind = 1+find(~ismember(diff(A),[1 -11]));

ind给出相对于当前序列的位置A,而不是完成的序列.

例如,与

A =[00;01;02;  04;05;06;07;08;09;10;11;00;01;02;03;    ;06;07;08;09;10;11]; 

这给了

>> ind = 1+find(~ismember(diff(A),[1 -11]))

ind =

     4
    16
于 2013-10-31T15:52:23.797 回答