matlab - 组合不同频率的数据矩阵

标签 matlab time-series fill

在 MATLAB 中,我如何组合在不同频率下测量的两个数据矩阵,以便结果以更高的频率索引?由于以较低频率测量的数据在结果中会有许多未知值,我想用矩阵中最后已知的值替换它们。有大量数据,因此首选矢量化解决方案。我在下面添加了一些示例数据。

给定:

    index1  data1  index2  data2
    1       2.1    2       30.5
    2       3.3    6       32.0
    3       3.5    9       35.0
    4       3.9    13      35.5
    5       4.5    17      34.5
    6       5.0    20      37.0
    7       5.2    ...     ...
    8       5.7
    9       6.8
    10      7.9
    ...     ...

结果:

    index1  data1  data2
    1       2.1    NaN
    2       3.3    30.5
    3       3.5    30.5
    4       3.9    30.5
    5       4.5    30.5
    6       5.0    32.0
    7       5.2    32.0
    8       5.7    32.0
    9       6.8    35.0
    10      7.9    35.0
    ...     ...    ...

编辑: 我认为以下帖子接近我的需要,但我不确定如何转换解决方案以适应我的问题。 http://www.mathworks.com/matlabcentral/newsreader/view_thread/260139

编辑(几个月后): 我最近遇到了这个很棒的小功能,我认为它可能对登陆这篇文章的任何人都有用:

function yi = interpLast(x,y,xi)
%INTERPLAST Interpolates the input data to the last known value.
% Note the index data should be input in ASCENDING order.
inds = arrayfun(@findinds, xi);
yi = y(inds);

function ind = findinds(val)
    ind = find(x<=val,1,'last');
    if isempty(ind)
        ind = 1;
    end
end

end

致谢:http://www.mathworks.com/support/solutions/en/data/1-48KETY/index.html?product=SL&solution=1-48KETY

最佳答案

问题是游程解码的问题之一。参见 Matlab array manipulation tips and tricks 的第 15.5.2 节(对于任何 Matlab 爱好者来说,这都是一本大开眼界的读物)。

这是在您的示例中使用该方法(我使用的是 octave,但代码与 Matlab 相同):

octave:33> a=[2,30.5;6,32;9,35;13,35.5;17,34.5;20,37]
a =

    2.0000   30.5000
    6.0000   32.0000
    9.0000   35.0000
   13.0000   35.5000
   17.0000   34.5000
   20.0000   37.0000

octave:34> i=a(:,1)-1
i =

    1
    5
    8
   12
   16
   19

octave:35> j=zeros(1,i(end))
j =

   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

octave:36> j(i(1:end-1)+1)=1
j =

   0   1   0   0   0   1   0   0   1   0   0   0   1   0   0   0   1   0   0

octave:37> j(1)=1
j =

   1   1   0   0   0   1   0   0   1   0   0   0   1   0   0   0   1   0   0

octave:38> val=a(:,2)
val =

   30.500
   32.000
   35.000
   35.500
   34.500
   37.000

octave:39> x=val(cumsum(j))
x =

   30.500
   32.000
   32.000
   32.000
   32.000
   35.000
   35.000
   35.000
   35.500
   35.500
   35.500
   35.500
   34.500
   34.500
   34.500
   34.500
   37.000
   37.000
   37.000

并根据需要用 NaN 填充开头。

关于matlab - 组合不同频率的数据矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12648348/

相关文章:

matlab - 显示带有行和列标签的矩阵

r - 使用 bfast 检测季节性成分的变化

mysql - 在结果集中没有日期间隔的日期范围内按日期聚合数据

MATLAB,填充两组数据之间的区域,一张图中的线条

c# - 如何在 ASP.NET MVC3 中填充 ViewModel

Python:前向填充 nans 和 zeros

python - scipy/numpy 中 matlab interp2 样条线的等效项

matlab - 使用 audioread 或等效的以特定时间戳播放音频

matlab - 重新排列 MATLAB 表变量(2016 版)

python - 在多索引数据框中移动缺少日期的列