我在同一时间段内拥有多组数据,时间为300秒。在观察期结束之前终止的集合(这里我将其截断为0到3000秒)在剩余空格中有NaN:
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];
我想知道每个数据集何时到达y等于特定值的点,在这种情况下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
然后我尝试在数据点之间进行线性插值,然后在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
并收到以下错误消息:
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
但我仍然无法解决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 );
对于其他方法的任何建议或想法将不胜感激。我需要能够为许多数据集执行此操作,所有数据集都具有不同数量的NaN值。