How to search the continuous values with maximal size in a vector ?
2 次查看(过去 30 天)
显示 更早的评论
How to search continuous values in a vector,meanwhile,the size of the continuous values is the largest? For example,
a=[1 2 3 4 5 6 7 11 13 14 15 18 19]
Here the answer should be
ans=[1 2 3 4 5 6 7]
Help me to find the answer for vector of size n. I want to use this to detect a portion which is linear in a curve. Is there some function in MATLAB which could do this work? Thanks.
0 个评论
采纳的回答
Cedric
2013-4-28
编辑:Cedric
2013-4-28
You can go for a solution around the following:
boundary = find([true, abs(diff(a))~=1, true]) ;
[blockSize, boundaryStart] = max(diff(boundary)) ;
With this and a defined by
>> a= [1 2 3 0 5 6 7 11 13 14 15 16 18 19] ;
you get:
>> boundary % Starting ID of blocks of contiguous integers.
boundary =
1 4 5 8 9 13 15
>> blockSize % Size of the first largest blocks.
blockSize =
4
>> boundaryStart % Starting ID of first largest block.
boundaryStart =
5
which you can use e.g. as follows:
>> blockRange = boundary(boundaryStart) + (0:blockSize-1) ;
>> a(blockRange)
ans =
13 14 15 16
Note that this method can be easily updated so you get all blocks that have the largest size.. it would be something like (not tested):
bDiff = diff(boundary) ;
boundaryStarts = find(bDiff==max(bDiff)) ;
and then you can iterate through elements of boundaryStarts to get all relevant blocks.
0 个评论
更多回答(1 个)
Alessandro Renna
2013-4-27
I wrote this function:
function y=continuous(a)
n=length(a);
for i=1:n-1
if diff(a(i:i+1))==1
z(i)=a(i);
z(i+1)=a(i+1);
end
end
y=z(z~=0);
In this way, if a is [1 2 3 4 5 6 7 11 13 14 15 18 19], the result y will be only the continuous part of a, [1 2 3 4 5 6 7 13 14 15 18 19].
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Language Support 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!