2014-09-18 4 views
1

Я пытаюсь создать массив строки из длинного предопределенного символьного массива в качестве следующегоГенерация случайных строки в MatLab

, если у меня есть следующая длинная строка:

s= 'aardvaqrkaardwolfaajronabackabacusabvaftabalongeabandonabandzonedaba' 

Я хочу создать группу случайных строк на основе следующих правил

  1. строка должна быть между 4 и 12 символами должны быть конца или начала

  2. с одним из следующих символов {j,q,v,f,x,g,b,d,z}

+0

Я прав, что вы хотите, чтобы символы были взяты из строки 's'? В противном случае я не понимаю, что такое '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Вы все еще хотите, чтобы их принимали за начало/конец символов? –

+0

и разрешено ли снова использовать тот же символ? Например. может ли строка быть 'jjjjjjjj', даже если в строке есть только 1 j? –

+0

да строки должны быть взяты без повторения и последовательно от s – Aabualia

ответ

0

Так здесь решение, которое дает все строки, которые FULLFILL следующие правила:

  • начальный и конечный символ должен быть из строки:

    start_end_char= 'jqvfxgbdz';

  • длина должно быть от 4 до 8 символов.

  • Строка должна быть последовательной. Значение результирующие строк должны появляться в точно так же, в «длинной» строке

Так что я делаю?

  • Прежде всего я нахожу все позиции, где предопределенные начальные и конечные символы отображаются в главной строке (осторожно я использовал s2 вместо s в качестве имени строки).
  • Тогда я получить отсортированный список этих точек (list_sorted)
  • Следующая вещь, чтобы получить для каждого элемента списка индексов, приемлемые конечные символы (следующие правила 1 и 2, указанных выше). Они сохраняются в helper, который должен быть тип данных ячейки из-за различной длины в строках.
  • последнее, но не менее важное. Я строю все эти строки и сохраняю их в resulting_strings, которые также должны быть типами данных ячейки.

    s2= 'aardvaqrkaardwolfaajronabackabacusabvaftabalongeabandonabandzonedaba'; 
    start_end_char= 'jqvfxgbdz'; 
    length_start = length(start_end_char); 
    
    %%finding all positions of possible starting/ending points 
    position_char= cell(1,length_start); 
    for k=1:length_start 
        position_char{k}=find(s2==start_end_char(k)); 
    end 
    list_of_start_end_points=[]; 
    %% getting an array with all starting/ending points in the given array 
    for k=1:length_start 
        list_of_start_end_points= horzcat(list_of_start_end_points,position_char{k}); 
    end 
    sorted_list= sort(list_of_start_end_points); 
    %% getting possible combinations 
    helper = cell(1, length(sorted_list)); 
    length_helper=[]; 
    for k=1:length(sorted_list) 
        helper{k}=find(and(sorted_list-sorted_list(k)>=4,sorted_list-sorted_list(k)<=8)); 
        length_helper = length_helper + length(helper); 
    end 
    resulting_strings = cell(1, length_helper); 
    l=1; 
    for k=1:length(sorted_list) 
        for m=1:length(helper{k}) 
         resulting_strings{1,l} = s2(sorted_list(k):sorted_list(helper{k}(m))); 
         l=l+1; 
        end 
    end 
    

Это решение использует довольно много циклов, в то время как первые 2 петли negatable (Нет петель в размере приемлемого начала/заканчивающиеся буквы), позднейшие две петли может быть довольно много времени если исходная строка намного длиннее. Поэтому, возможно, кто-то найдет векторизованное решение для более поздних циклов.

+0

супер хелпер .... – Aabualia

+0

только понял, что мои правила немного отличаются от ваших. В моем коде начальный И конечный символ должен быть частью группы '' jqvfxgbdz'', а не только одним из них. Так что вам придется переработать более позднюю часть программы, чтобы соответствовать всем случаям, но это будет список LOOOONG –

+0

последнее, что я могу перетасовать этими словами в массиве – Aabualia