【问题标题】:How to resample with interp1 in Matlab when input vectors are of different length当输入向量的长度不同时,如何在 Matlab 中使用 interp1 重新采样
【发布时间】:2012-12-16 08:26:34
【问题描述】:

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

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

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

由于速度是一个连续变量函数,因此得到的区间行程时间和积分行程时间都是非整数且大小可变

我想要的是以固定的时间间隔(例如 1 毫秒、2 毫秒、...、n 毫秒)重新采样距离向量

难点在于最大行程时间 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 比向量 ind 短 1 个样本(删除了一个重复项)。

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

谢谢

【问题讨论】:

    标签: matlab time-series interpolation sampling resampling


    【解决方案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);
    

    【讨论】:

    • 感谢 Natan。目标是定期(每毫秒)获取距离值。这恰好与 1:1:length(idx) 相同。如果我对每 10 毫秒重采样一次感兴趣,那么我的兴趣点将是 1:10:length(idx)。这是典型的预期应用,即显示反射地震数据(其中距离是深度)。关于外推:所以我可以在 interp1 中使用外推选项,对吗?您是否会以不同的方式处理整个问题 - 即有什么方法可以更有效地完成整个工作?
    • mmmmmh 现在我想起来了,如果我使用 [1:length(idx) xi] 作为第三个参数,那么它再次比第一个和第二个参数 clsst 和 testz(idx) 长吗?
    • 您的代码中什么不够高效?我可能可以让它更快一些,但它对我来说似乎不错......你可以取出 for 循环,但使用最近的 JIT (matlabtips.com/matlab-is-no-longer-slow-at-for-loops),我敢打赌这不会改变性能......
    • 第三个参数的长度不必相等,可以是标量、向量或多维数组,doc interp1 看看...
    • 没错。好的,你完全正确。在挪威这里是深夜,我一定很累。在我编写前两个代码单元之前,我遇到了长度不同的第一个和第二个参数的问题。这就是我开始写这篇文章的原因。感谢您对我的代码的反馈。我会将您的答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    相关资源
    最近更新 更多