Extract sequences from vector

3 views (last 30 days)
Peter
Peter on 27 Feb 2013
Answered: Saeid Abrari on 6 Oct 2020
Dear Forum members,
I have a question I could not find any solution for. I have a vector, let's say
U=[2,2,5,7,3,4,4,4,2,2,2,3].
I also have a sequence, which is
s=[2,2,3].
I now want to find all the indexes in U, where my sequence s could be built from. In my case, that would be
(1,2,5), (9,10,12), (10,11,12), (9,11,12). So the problem is the sequences have to be build first from U and do not exist as in s. I find this quite tough and would be happy if someone had a solution.
I have Matlab 7.13.
Thanks a lot! Peter
  2 Comments
Azzi Abdelmalek
Azzi Abdelmalek on 27 Feb 2013
Edited: Azzi Abdelmalek on 27 Feb 2013
Are you looking for all the sequences?, for example (2,5,7,3)
Peter
Peter on 28 Feb 2013
Hello Azzi!
I do not really understand what you mean with (2,5,7,3). Maybe my example was a bit confusing! I search for all values in U that could be used to build s, but only in chronological order, so I realized I forgot some in my example. U(1,1,12) would also correspond to s, or U(2,9,12), U(1,2,5) etc.
At the end of the day, I want to find the values (2,2,3) in U that are closest together, so in my example I would search for U(10,11,12). But: it can happen in my real data that the values of s are only in U with interruptions, otherwise it would be a simple task. My plan was to to first find all possible triples in U that could be used to build s and then find out via their indexes which triple is closest together.
Is this clearer now?
Kind regards and many thanks, Peter

Sign in to comment.

Answers (4)

Babak
Babak on 27 Feb 2013
perms
nchoosek
might be helpful in finding combinations of the elements of different size vectors.

Peter
Peter on 28 Feb 2013
Edited: Peter on 28 Feb 2013
I think I could come up with a solution myself
x=[2,2,5,7,3,4,4,4,2,2,2,3]'; y=[2,2,3]';
p=0; s=0; t=0;
for i=1:length(x);
for t=1+s:length(x); % here the code goes down one line
if p<length(y);
if x(t,1)==y(p+1,1);
codes(p+1,s+1)=t;
p=p+1;
end;
end;
end;
s=s+1;
p=0;
end;
codes=codes';
codes=unique(codes,'rows');
k=find(sum(codes==0,2)>0);
codes(k,:)=[]; % incomplete triples from end of the code are removed
codes=codes';
The code goes through all records in U (here called x) and looks up s (here called y). The final matrix in codes contains all indices in x from which y can be built from.
  1 Comment
Babak
Babak on 28 Feb 2013
Nice solution. I rather let "codes" be a cell object with option of having empty cells. Then you can support finding zero elements in y and your
k=find(sum(codes==0,2)>0);
line wouldn't fail for length(y)>3.

Sign in to comment.


Saeid Abrari
Saeid Abrari on 6 Oct 2020
for dig=1:16
ndata = length(Frame);
ndata_1=length(digit(dig,:));
n_diff=abs(ndata-ndata_1);
Sound_1=[digit(dig,:)';zeros(n_diff,1)];
sx = sum(Frame.^2);
sy = sum(Sound_1.^2);
maxlag = ndata-1;
cnt = 0;
for lag = -maxlag:maxlag
cnt = cnt + 1;
sxy = 0;
for i=1:ndata
j = i + lag;
if j>0 && j<=ndata
sxy = sxy + Frame(i) * SoundVec_1(j);
end
end
cc(cnt) = sxy / sqrt(sx*sy); % correlation coefficient
ck(cnt) = sxy; % cross-correlation value
lags(cnt) = lag;
end
simil(dig)=max(cc);
[~,i] = max(cc);
Ts=1/Fs;
t1=Ts:Ts:FrameLen*Ts;
norm_ck=cc/max(cc);
lx = (length(norm_ck));
half = ceil(lx/2);
norm_ck_p=norm_ck(1:half);
td = i - ndata;
tau1=lags/Fs;

Saeid Abrari
Saeid Abrari on 6 Oct 2020
for dig=1:12
ndata = length(Frame);
ndata_1=length(digit(dig,:));
n_diff=abs(ndata-ndata_1);
Sound_1=[digit(dig,:)';zeros(n_diff,1)];
sx = sum(Frame.^2);
sy = sum(Sound_1.^2);
maxlag = ndata-1;
cnt = 0;
for lag = -maxlag:maxlag
cnt = cnt + 1;
sxy = 0;
for i=1:ndata
j = i + lag;
if j>0 && j<=ndata
sxy = sxy + Frame(i) * SoundVec_1(j);
end
end
cc(cnt) = sxy / sqrt(sx*sy); % correlation coefficient
ck(cnt) = sxy; % cross-correlation value
lags(cnt) = lag;
end
simil(dig)=max(cc);
[~,i] = max(cc);
Ts=1/Fs;
t1=Ts:Ts:FrameLen*Ts;
norm_ck=cc/max(cc);
lx = (length(norm_ck));
half = ceil(lx/2);
norm_ck_p=norm_ck(1:half);
td = i - ndata;
tau1=lags/Fs;
%Find the maximum corellation index(digit)
if(max(simil)>0.5)
[seqm sequ(s_loc)]=max(simil);
s_loc=s_loc+1;
end

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!