Find if two numbers occurs in the same sequence

12 ビュー (過去 30 日間)
Manoj
Manoj 2014 年 10 月 22 日
コメント済み: Guillaume 2014 年 10 月 23 日
Hello
I would like to know how to determine if numbers occur in the same sequence.
[3 1 5 0 0
1 2 5 0 0
1 3 4 1 5
2 1 5 0 0]
For example in row 1 , we can see that 1 is followed by a 5. Now I need to determine if the same happens in row 2. But in this case 1 is followed by a 2 and then 5.
In that case I need to delete the second row and check with the third row.
When I compare row 1 and row 3 , though 1 is followed by a 5 , 3 should be followed by a 1 in row 1. But in row 3, 3 is followed by a 4, so need to delete this as well.
When you compare row 1 and row 4, since 1 is followed by a 5 in both cases I retain row 4 ( even though the first numbers are different).
So my final answer should be.
[3 1 5 0 0
2 1 5 0 0]
If a row is retained , then the checking needs to start from that row on wards. That is row 4 will now be checked with row 5 and not row 1.
I hope I have explained it correctly, if not I will clear it out better if anyone has any questions.I am not sure how to proceed and any help would be appreciated. Thanks in advance
  2 件のコメント
Ced
Ced 2014 年 10 月 22 日
編集済み: Ced 2014 年 10 月 22 日
How big are the matrices in question? Do you know which numbers can be present?
The easiest (note: inefficient) way I can think of right now is to do it in two steps:
Step 1: Set up a matrix, where e.g. column 1 contains all occurring numbers, and column 2 the numbers that should come after them.
Step 2: iterating over column one, look for each occurrence of the value in your matrix, check if the next value matches your value from column 2, and act accordingly.
Guillaume
Guillaume 2014 年 10 月 23 日
For your information I've turned a variation of this question into a cody problem.

サインインしてコメントする。

採用された回答

Guillaume
Guillaume 2014 年 10 月 22 日
Does this do what you want?
m = [3 1 5 0 0
1 2 5 0 0
1 3 4 1 5
2 1 5 0 0];
out = m(1, :); %output matrix
comprow = 1; %row that must be matched
for row = 2:size(m, 1) %iterates from row 2 onwards
[~, match] = ismember(m(row, :), nonzeros(m(comprow, :))); %find positions of numbers in common, ignoring 0s
%we now need to make sure that the elements that match are in sequence, that is that the
%min of match (ignoring 0, unmmatched element) to the max of match are in sequence.
%strfind also find sequences in numbers
minpos = min(nonzeros(match));
maxpos = max(match);
if strfind(match, minpos:maxpos) %works with numbers as well
out(end+1, :) = m(row, :); %match, then copy
comprow = row; %use current row for further comparison
end
end
  5 件のコメント
Guillaume
Guillaume 2014 年 10 月 22 日
Alright, then you just change the if to:
if strfind(match, minpos:maxpos) && ~isequal(m(row, :), m(comprow, :))
Manoj
Manoj 2014 年 10 月 22 日
Thank you once again , works brilliant.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by