2014-12-03 2 views
1

저는 2D (x, y) 좌표로 정리 된 데이터가 있습니다. 나는이 데이터의 양이 많고 X 축의 데이터가 모든 점에 대해 동일한 범위를 가지지 만 데이터 집합간에 동일한 정확한 X 점을 사용하지 않습니다. 각 데이터 집합을 보간하고 각 데이터 집합에 대해 동일한 X 점을 잡고 싶습니다. Matlab을 사용하여 데이터를 시도하고 보간 할 때마다 문제가 발생합니다. x와 y가 내 기록 된 데이터 값과 XQ 있습니다Matlab 보간 1D 분산 데이터

x = [0 1 2 3 4 5 6 7] 
y = [2.2 3.7 3.9 4.1 4.2 8.9 9.1 9.3] 
xq = [0.5 0.75 2 2.25] 

내가 보간 데이터에서 얻을하고자하는 새로운 X 포인트는 같은

그래서 내 데이터 보인다.

는 일반적으로 나는 등의 interp1 명령을 사용

f = interp1(x,y,xq); 

불행하게도이 명령은 오류 발생 : ". 격자 벡터가 증가 엄격하게 단조하지 않습니다를" 이것은 griddata 또는 관련 명령을 사용하는 경우 발생합니다. 필자는 이것이 함수가 아닌 데이터를 가지고 있기 때문에 흩어져있는 데이터를 다루는 기술이 필요하다는 것을 알고 있습니다. 그래서 scatteredInterpolant를 사용하려고 시도했지만 x, y 및 v (값) 행렬이 필요하므로이 유형의 데이터에는 적합하지 않은 것처럼 보입니다.

저는 계속하는 방법, 조언 및 제안에 큰 손실을 입었습니다.

+3

당신의'x'와'y' 배열은 같은 크기가 아닙니다. – eigenchris

+0

죄송합니다. 내 데이터를 대표하지만 실제 복사본이 아닌 배열을 만들었습니다. 귀하의 의견을 반영하도록 배열을 편집했으며, 동일한 크기인지 확인했습니다. 내 데이터는 x와 y가 같은 크기임을 확신 할 수 있습니다. – DirectNirvana

+0

아마도'resample'이 도움이 될 수 있습니다. – Rashid

답변

3

코드의 실제 작동 예제와 오류를 던진 입력 데이터의 실제 버전을 제공해야하지만 실제로이 작업을 수행 할 것입니다. 코드 및 데이터 당신은 잘 작업을 게시 :

f = 

     2.95  3.325   3.9   3.95 

당신이지고있어 오류가 여기에 귀하의 예에, 그렇지 않으면 중복 값을 포함로 실제 x 벡터가 정렬되지 않습니다 것을 의미한다 (즉, x = [0 1 1 2 3];를) . issorted(x) 명령을 사용하여 첫 번째 경우를 테스트하고 any(diff(x) == 0)을 사용하여 두 번째 테스트를 수행 할 수 있습니다.

첫 번째 사건은 해결하기 쉬운 :

응용 프로그램에 따라, 두 번째 경우를 처리 할 수있는 몇 가지 방법이 있습니다
[x,ix] = sort(x); 
y = y(ix); 
xq = sort(xq); 
yq = interp1(x,y,xq); 

. 중복을 검색하고 ± eps만큼 이동하거나 평균을 내거나 버릴 수 있습니다.

오류가 중복되는 데이터가 없더라도 우리는 모두 추측에 불과합니다.

업데이트 :

당신이 게시 된 데이터를 보면 (그리고 후손을 위하여 당신이 당신의 질문에 직접 편집한다), 당신은 둘 다 문제가있다. 데이터가 정렬되지 않고 중복됩니다. 내가 말했듯이, 정렬은 쉽습니다.

xu = unique(x); 
yu = y; 
duplicated = xu(histc(x,xu) > 1); % find the duplicated entries 
discardIndex = []; 
for k = 1:length(duplicated); 
    dupIndex = sort(find(x == duplicated(k))); % look for duplicated entries 
    keepIndex = dupIndex(1); % keep only the first one 
    discardIndex = [discardIndex dupIndex(2:end)]; % add the rest to a list 
    yu(keepIndex) = mean(y(:,dupIndex)); % take the mean of the y values at the duplicated x values 
end 
yu(discardIndex) = []; % after all is said and done, delete the duplicated entries. 

내가 오래 전에 쓴 거의 확실히 그것을 할 수있는 가장 효율적인 방법은 아니다 : 위와 같이 정렬 후이 내가 중복 항목 돌봐 과거에 한 일이다 , 그러나 그것은 작동 할 것이다.

+0

상기 코멘트의 반복 다음 X 데이터의 샘플에서 확인할 수 notepad.cc/share/Xyw7MlZ04H 및 Y 데이터의 샘플 notepad.cc/share/bdbHaRS74F에서 사용할 이 작은 샘플 데이터를 사용하여 위에서 설명한 오류를 재현 할 수있었습니다. – DirectNirvana

+1

x 값에 중복 된 부분이 있음을 발견했습니다. Craigim이 말했듯이, 당신은 이것들을 다루는 방법을 찾아야합니다. 그 문제를 해결 했니? – eigenchris

+0

감사합니다 @craigim 및 eigenchris, 귀하의 제안은 훌륭하게 작동했습니다. 먼저 craigim이 제안한 것과 동일한 코드를 사용하여 정렬을 시도했지만 스크립트에는 여전히 동일한 오류가있었습니다. 일부 복제본이 있기 때문에, 나는 '[x, ia, ic] = unique (x);'라는 코드를 사용하여 matlab의 'code'unique 명령을 사용하여 코드를 제거했습니다. 'y = y (ia);' 'yq = interp1 (x, y, xq);' 'plot (xq, yq);' – DirectNirvana