2013-08-25 2 views
0

Matlab에 간단한 스크립트를 작성하여 인접한 요소를 비교하고 그 차이가 하나라도 있으면 그 중 하나를 삭제합니다.배열의 원소를 지우는 것, 범위를 벗어난 인덱스 (Matlab)

for i=1:length(Vector) - 1 
if Vector(i+1) - Vector(i) == 1 
    Vector(i) = []; 
end 
if i == length(Vector) 
    break 
end 

그러나, 나는 내 인덱스가 경계 밖에있는 오류를 받고 있어요. 왜 알고리즘이 작동하는지 잘 모르겠습니다. 아마도 내부 함수로 이것을 수행하는 더 간단한 방법이 있을까요?

답변

3

문제는 당신이 할 때이다 존재 않습니다 ur 배열을 사용하면 찾고 있지 않은 결과가 먼저 생기고 두 번째 if 조건은 스크립트가 경계 밖으로 나가는 것을 막지 못합니다. 이 문제를 해결하는 한 가지 방법은 보조 벡터를 사용하는 것입니다.

Vector = [1,5,6,3,5,7,8,9]; 
tmp = []; 
j = 1; 

for i=1:length(Vector)-1 
    if Vector(i+1) - Vector(i) == 1 
     continue 
    end 
    tmp(j) = Vector(i); 
    j = j + 1; 
end 

tmp(end+1) = Vector(end); 
Vector = tmp 

항상 마지막 요소를 유지하려고한다고 가정합니다.

당신도 할 수있는 루프를 방지하려면

:

Vector = [1,5,6,3,5,7,8,9]; 
tmp = circshift(Vector, [0,-1]); %shifted version of Vector 
tmp(end) = Vector(end)+2; %To ensure that the last element will be included 
index = tmp-Vector ~= 1; %indices that satisfy the condition 
Vector = Vector(index) 
0

내가 생각이

경우 벡터 (I + 1) - 벡터 (I) == 1

당신이 크기 1 인덱스 I의 벡터가있을 때 문제가 될 수 +

Vector(i) = [] 

당신은 요의 크기를 변경 : 1는하지

+0

나는 당신이 옳다고 생각합니다. 어쩌면이 방식으로 요소를 비교하지 않는 것이 더 나은 방법 일 것입니다. – l3win

2

pabaldenedo 문제가 반복의 중간에 요소를 제거하는 것이 올바른 것입니다. 훨씬 빨리

mask = [diff(Vector) == 1, 0]; % find elements where the step is 1 
Vector = Vector(~mask);  % exclude them 

이 또한 있어야한다 :

더 나은 솔루션 검색 및 제거를 벡터화하는 것입니다.

반복되는 요소가 이전 요소보다 하나 큰 경우 제거해야하는 경우 반복 할 수 있습니다. 불행히도 MATLAB에는 do-while 루프가 없습니다.

mask = [diff(Vector) == 1, 0]; % find elements where the step is 1 
while any(mask)    % if we found elements to exclude 
    Vector = Vector(~mask);  % exclude them 
    mask = [diff(Vector) == 1, 0]; % search again 
end 
+0

왜 첫 번째 줄에 벡터에 0을 포함해야합니까? 마스크 = [diff (Vector) == 1, 0] – l3win

+0

신경 쓰지 마세요. – l3win

관련 문제