2017-10-09 6 views
0

Matlab을 사용하여 크기가 1xn 인 임의의 배열에서 가장 긴 연속 시퀀스의 크기를 찾고 싶습니다. 나는 이것을 할 수있는 두 가지 방법이 있다는 것을 알고있다 : 1) 루프를 사용하고 2) Matlab 함수를 사용한다. 찾을 수 있지만 둘 다 사용하지 않고이 작업을 수행하는 방법은 확실하지 않습니다.matlab을 사용하여 1xn 크기의 무작위 배열에서 가장 긴 연속 시퀀스의 크기 찾기

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

이에서 가장 긴 순서는 내가이 시도 5.

크기의 것 10 11 12 13 14 것이다 그러나 그것은 작동하지 않습니다

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); 

테스트의 결과는 finish = 11, start = 5 제공합니다. 블록 길이를 반환하려는 경우

+0

으로 대체하십시오. 덕분에 문제를 해결할 수있었습니다. 제 친구가 diff와 max 함수를 사용하지 않고 그냥 루프 (예 :)로 처리하는 것이 가능할 것이라고 언급했지만 어디에서 시작해야할지 모르겠습니까? 루프를 작성하여 각 시퀀스의 길이를 계산하고 저장 한 다음 더 긴 시퀀스를 찾으면 그 길이를 바꾸는 선을 따라 뭔가를 추측합니다. 어떻게 이걸 쓸거야? –

+1

MATLAB이 일반적으로 벡터화에 최적화되어 있다는 점을 감안하면 그럴 가치가 없습니다. MATLAB이 모든 것을 하나씩 할 수있게 할 때, 한 번에 벡터 요소 하나를 통과 할 이유가 없습니다. – craigim