当输入向量长度不同时,如何在Matlab中使用interp1重新采样

时间:2013-01-01 20:51:37

标签: matlab time-series interpolation sampling resampling

我在.mat文件中有两个变量: https://www.yousendit.com/download/UW13UGhVQXA4NVVQWWNUQw

testz是累积距离的矢量(以米为单位,单调且有规律地增加)

testSDT是使用距离矢量和速度矢量生成的积分(累积)声波传播时间(以毫秒为单位)的矢量 (有一个创建间隔旅行时间的中间步骤)

由于速度是一个连续可变的函数,因此得到的间隔行程时间以及积分行程时间都是非整数且幅度可变

我想要的是以规则的时间间隔(例如1 ms,2 ms,...,n ms)重新采样距离矢量

最困难的是最大行程时间994.6659小于2个矢量中的样本数,因此使用interp1并不简单。 即:

X = testSDT - > 1680个样本

Y = testz - > 1680个样本

XI = [1:1:994] - > 994个样本

这是我提出的代码。这是一个有效的代码,我认为这并不算太糟糕。

%% Initial chores
M=fix(max(testSDT));
L=(1:1:M);     

%% Create indices
% this loops finds the samples in the integrated travel time vector
% that are closest to integer milliseconds and their sample number
for i=1:M
  [cl(i) ind(i)] = min(abs(testSDT-L(i)));
  nearest(i) = testSDT(ind(i)); 
end

%% Remove duplicates
% this is necessary to remove duplicates in the index vector (happens in this test). 
% For example: 2.5 ms would be the closest to both 2 ms and 2 ms
[clsst,ia,ic] = unique(nearest);
idx=(ind(ia));

%% Interpolation
% this uses the index vectors to resample the depth vectors at
% integer times
newz=interp1(clsst,testz(idx),[1:1:length(idx)],'cubic')';

据我所知,此代码存在一个问题: 我依靠向量idx作为插值的XI。向量idx比vector ind短1个样本(删除了一个副本)。

因此,我的新时代将停止一毫秒。这是一个非常小的问题,重复是不太可能的,但我想知道是否有人可以想到一个解决方法,或者完全解决问题的不同方法。

谢谢

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你想要推断到那个额外的点。 你能做到这一点有很多种方法,一种是将额外的点添加到interp1行。 如果您有一些功能,您希望跟随您的数据,您可以通过将其与数据拟合然后获得该额外点或使用fnxtr之类的工具来使用它。

但是由于您使用该线路的方式,我在理解您的需求方面存在问题。您使用的第三个参数[1:1:length(idx)]只是系列[1 2 3 ...],通常在插值时,使用一些感兴趣的点x_i,但我怀疑您的兴趣点碰巧是一系列整数1:length(idx),你想要的只是[1:length(idx) xi],其中xi是额外的x轴值。

修改

而不是循环只是从LtestSDT生成矩阵形式,那么在执行min(abs(...时矩阵运算会更快一些:

  MM=ones(numel(testSDT),1)*L;
  TT=testSDT*ones(1,numel(L));
  [cl ind]=(min(abs(TT-MM)));
  nearest=testSDT(ind);