2017-10-09 287 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