2016-08-07 10 views
0

私は同じ期間に多くのデータセットを持ち、タイムステップは300秒です。観察期間の終了前に終了を設定します(ここでは、私が3000秒に0に切り捨てられました)残りのスペースに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

Iは、データポイント間の線形補間を行う試み、その後、Y = 2.5でxについて解くことが、この作業を行うことができなかった。

まず私は(それ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 

とGET次のエラーメッセージ:私は(ちょうど1つのデータセットのために)ループの外でフィッティングしてみてください

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を解決することはできません(x)= 2.5とし、y = 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); 

oに関するアドバイスや考えこれに対するアプローチは非常に高く評価されるだろう。私は多くの多くのデータセットでそれを行うことができる必要があります。これらのデータセットの数はそれぞれ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

それは上記のコードは、あなたのデータが単調に(あなたのデータのように)減少していると仮定されていることを念頭に置いて価値があるようなものを使用することができますが、このソリューションは、可能性単調に増加するように適応されてもよい。

関連する問題