2016-08-07 1 views
0

동일한 시간대에 걸쳐 300 초의 타임 스텝을 사용하여 많은 데이터 세트를 보유하고 있습니다. 관찰 기간 (여기에 내가 0 3000 초에 절단 한)이 끝나기 전에 종료 설정은 나머지 공간에 NaN이 있습니다MATLAB의 데이터 포인트 간의 독립 변수를 해결합니다.

x = [0;300;600;900;1200;1500;1800;2100;2400;2700;3000]; 
y(:,1) = [4.65;3.67;2.92;2.39;2.02;1.67;1.36;1.07;NaN;NaN;NaN]; 
y(:,2) = [4.65;2.65;2.33;2.18;2.03;1.89;1.75;1.61;1.48;1.36;1.24]; 
y(:,3) = [4.65;2.73;1.99;1.49;1.05;NaN;NaN;NaN;NaN;NaN;NaN]; 

data plot 내가 몇시에 각 데이터 세트는 것로 알고 싶습니다 y = 2.5

가장 가까운 y 값을 2.5로 찾은 다음 관련 시간을 사용하여 시도했지만 매우 정확하지는 않습니다 (도트 모두 같은 수평선에 있어야 함) :

ybreak = 2.5; 

for ii = 1:3 
[~, index] = min(abs(y(:,ii)-ybreak)); 
yclosest(ii) = y(index,ii); 
xbreak(ii) = x(index); 
end 

data with dots for the time at which y=2.5

난 후 데이터 포인트 사이의 선형 보간을 수행하고, Y = 2.5 (X)에 대한 해결했지만,이 작업 할 수 없었다 (

먼저 I는 NaN이 제거를하는 그것을 수행하는 간단한 방법이있을 것 같다) :

for ii = 1:3 
    NaNs(:,ii) = isnan(y(:,ii)); 
    for jj = 1:length(x);  
     if NaNs(jj,ii) == 0; 
      ycopy(jj,ii) = y(jj,ii); 
     end 
    end 
end 

그런 시도 피팅

for ii = 1:3      
f(ii) = fit(x(1:length(ycopy(:,ii))),ycopy(:,ii),'linearinterp'); 
end 

그리고 수 다음과 같은 오류 메시지가 : 나는 (하나 개의 데이터 집합) 루프 외부에 장착하려고

Error using cfit/subsasgn (line 7) 
Can't assign to an empty FIT. 

, 그것은 잘 작동 :

f = fit(x(1:length(ycopy(:,1))),ycopy(:,1),'linearinterp'); 

f = 

    Linear interpolant: 
     f(x) = piecewise polynomial computed from p 
    Coefficients: 
     p = coefficient structure 

fitted curve for one dataset

하지만 다음 여전히 F를 해결할 수 Y는 O 2.5

syms x; 
xbreak = solve(f(x) == 2.5,x); 

Error using cfit/subsref>iParenthesesReference (line 45) 
Cannot evaluate CFIT model for some reason. 

Error in cfit/subsref (line 15) 
     out = iParenthesesReference(obj, currsubs); 

어떤 조언이나 생각되는 = (X) = 2.5 시간을 찾기 위해 이것에 대한 접근 방식은 많이 감사 할 것입니다. 많은 수의 데이터 세트에 대해이 작업을 수행 할 수 있어야합니다.이 작업에는 모두 다른 수의 NaN 값이 있습니다.

답변

1

y=2.5은 데이터 세트에 없으므로 여기에 해당하는 x의 값은 사용하는 보간 방법에 따라 다릅니다. 선형 보간를 들어, 다음과 같은

x = [0;300;600;900;1200;1500;1800;2100;2400;2700;3000]; 
y(:,1) = [4.65;3.67;2.92;2.39;2.02;1.67;1.36;1.07;NaN;NaN;NaN]; 
y(:,2) = [4.65;2.65;2.33;2.18;2.03;1.89;1.75;1.61;1.48;1.36;1.24]; 
y(:,3) = [4.65;2.73;1.99;1.49;1.05;NaN;NaN;NaN;NaN;NaN;NaN]; 

N = size(y, 2); 
x_interp = NaN(N, 1); 
for i = 1:N 
    idx = find(y(:,i) >= 2.5, 1, 'last'); 
    x_interp(i) = interp1(y(idx:idx+1, i), x(idx:idx+1), 2.5); 
end 

figure 
hold on 
plot(x, y) 
scatter(x_interp, repmat(2.5, N, 1)) 
hold off 

enter image description here

그것은 위의 코드는 데이터가 단조 (데이터가 그대로) 감소 가정 것을 염두에두고 가치 같은 것을 사용할 수 있지만이 솔루션은 수 단조롭게 또한 증가하도록 적응 될 수있다.