Что было бы хорошим подходом к идентификации «множественных, перекрывающихся, повторяющихся паттернов» в логическом векторе с помощью Matlab? - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь идентифицировать и разделять повторяющиеся шаблоны, относящиеся к началу логического вектора. Я все еще разбираюсь в векторной математике, поэтому в итоге я создал неприлично длинное приложение для перебора, которое работает, но ненадежно и действительно является оскорблением для MatLab. Теперь я пытаюсь провести вектор относительно его двойника и использовать логическое «И» между ними, чтобы указать возможные совпадения. Я искал Inte rnet в поисках примеров и нашел некоторые повторяющиеся шаблоны, но не перекрывающиеся. Мне нужно руководство. Код ниже - мой генератор тестовых векторов. Проще говоря, я хочу извлечь ту же информацию из вектора, который я использую здесь для ее создания. (Фактические шаблоны будут иметь большую ширину.)
В коде матрица (pSet) определяет шаблоны. Строки представляют каждый шаблон, а столбцы определяют этот шаблон. (Колонка 1) Интервал, определяющий узор. (Столбец 2) Длина шаблона (циклы) (0 = продолжить до конца) (Столбец 3) Смещение начала шаблона относительно начала. (Паттерны со смещениями - это «шум».) Конечно, будут структуры паттернов, которые затруднят извлечение (например, когда один паттерн будет кратным другому), но я могу иметь дело с теми, которые находятся на обратной стороне распознавания.

clear
% ------ conditionals (Gen single pattern) --------
only1 = uint16(0);  % set to id of individual pattern, leave at 0 otherwise
only2 = only1;      
% -------- Pattern Descriptor ---------
pSet = uint16([10 0 0; 6 0 0; 12 16 0; 8 5 0; 5 0 4]);
% -----------------------------
maxL = uint16(200);
v = zeros(maxL,1,'logical');
ofSet = uint16(0);
cycFreq = uint16(0);
cycEnd = uint16(0);
lpSet = uint16(length(pSet));
if only1 == 0
    only1 = uint16(1);
    only2 = lpSet;
end
for vi = only1:only2
    cycFreq = pSet(vi,1); % num data points in spacing
    cycBrk = pSet(vi,2);  % milepost that ends cycle series
    ofSet = pSet(vi,3) + 1;  % From beginning
    if cycBrk ~= 0
        cycEnd = cycFreq*(cycBrk+1);
    else
        cycEnd = maxL;
    end

    for vj = ofSet:cycFreq:cycEnd
        v(vj) = 1;
    end
end
...