Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Return to the start of a loop

Asked by googo on 16 Apr 2013

Hello,

I'm writing a function which returns the sequences of n requested letters in a string. For example, :

    string = 'abcad' , n=3
ans = 
    abc
    bca
    cad

Well, my code is :

function s=ngramsFreq(string,n)
  k=0;
  t = repmat(char(0),length(string)-n+1,n);
  for i=1:(length(string)-n)+1
      k=k+1;
      for j=1:n       
          for m=k:(k+n)-1
              t(i,j)=string(m);
              break
          end    
      end
  end
  s=t;
  end

When I'm runing the program for 'abcad', n=3 the function returns:

ngramsFreq('abcad',3)
      ans =
      aaa
      bbb
      ccc

I think the problem is in the inside loop:

for m=k:(k+n)-1
                t(i,j)=string(m);
                break
end    

I want it to end after one step and not keep looping. For example After t(1,1)=string(1) go to j=2 and not return to m=1.

Any help with this? thank you very much!

Note: For the meantime, if a sequence is showing twice or more the function will return both sequences or how many there is (for example: 'aaa' will return [aa;aa].

0 Comments

googo

Products

No products are associated with this question.

2 Answers

Answer by Andrei Bobrov on 16 Apr 2013
Edited by Andrei Bobrov on 16 Apr 2013
Accepted answer
str = 'abcad' ;
n=3;
out = str(  hankel(1:n,n:numel(str))  );

without hankel

out = str(  bsxfun(@plus,1:n,(0:numel(str) - n)') )

with while-loop

g = 1:n;
out = [];
while g(end) <= numel(str)
    out = [out;str(g)];
    g = g + 1;
end

3 Comments

googo on 16 Apr 2013

Hey, I can't use this (not allowed). You can help me fix the code that I wrote?

Thank's.

Andrei Bobrov on 16 Apr 2013

added variant with while-loop

googo on 16 Apr 2013

Thank's, I'll try this too.

Andrei Bobrov
Answer by Yao Li on 16 Apr 2013
function s=ngramsFreq(string,n)
  k=0;
  t = repmat(char(0),length(string)-n+1,n);
  for i=1:(length(string)-n)+1
      k=k+1;
                t(i,1:n)=string(k:1:(k+n)-1);
    end
    s=t;
    end

7 Comments

googo on 16 Apr 2013

I consider space as a tab also.

Yao Li on 16 Apr 2013

You can divide your algorithm to 2 steps: 1st find the specific group of letters. 2nd remove the repeated groups

googo on 16 Apr 2013

Thank's. I did like this:

[~,index] = unique(t,'first','rows');   
s = t(sort(index),1:n);   
Yao Li

Contact us