2017-10-09 47 views
0

我想使用Matlab找到大小为1xn的随机数组中最长序列的大小。我知道有两种方法可以做到这一点:1)使用循环和2)使用Matlab函数,例如发现,但我不确定如何做到这一点,而不使用两者?使用matlab查找大小为1xn的随机数组中最长序列的大小使用matlab

E.G. [1 2 3 5 8 9 10 11 12 13 14 17]

在这个最长的顺序将是10 11 12 13 14,这将是大小5

我尝试这样做的,但它不工作:

function [start, finish] = longest(sequence) 

x = diff(t)==1; 

f = find([false,x]~=[x,false]); 

g = find(f(2:2:end)-f(1:2:end-1)>=N,1,'first'); 

回答

1

你的变量别t匹配,但假设all(t == sequence)你是在正确的轨道上。你想通过做第二个diff区分每次运行的开始和结束。

% Mark all sequences 
x = diff(sequence) == 1; 

% Take the second derivative to find the edges 
xx = diff([false, x, false]); 

% This gives matched pairs of indexes for each block 
initial = find(xx == 1); 
final = find(xx == -1); 

% Get the block length 
blockLength = final - initial; 

% Get the max length 
[~, idx] = max(blockLength); 

% Return the indices 
start = initial(idx); 
finish = final(idx); 

您测试的结果给出start = 5,finish = 11。如果您还想返回块长度,请将~替换为变量名称

+0

这是一个很好的帮助,设法解决它谢谢。我的朋友提到它可能只用循环(即)没有差异和最大内置函数,但我不知道从哪里开始呢?我在写一个循环来猜测一些事情,以便继续计数并保存每个序列的长度,然后在找到更长的长度时替换该长度。你会如何写这个? –

+1

鉴于MATLAB通常针对向量化进行了优化,答案是我不会。我看不出有什么理由一次完成向量一个元素,因为你可以让MATLAB一举完成。 – craigim