组合不同频率的数据矩阵

时间:2012-09-28 22:51:09

标签: 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

2 个答案:

答案 0 :(得分:3)

问题是行程长度解码。请参阅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填充开头。

答案 1 :(得分:2)

我最近遇到了和你一样的问题:我有不同系统测量的数据,必须进行同步和处理。

我的解决方案包括将测量数据和时间信息(频率,测量开始时间)放在class object中。然后我为该类实现了一个乘法,加法等方法,它自动处理所有必要的事情,是:

  • 对低频信号进行上采样(使用线性插值(interp1
  • 移位其中一个信号,以便数据及时排列
  • 在开始和结束时切断不重叠的数据集(使用两个不同的系统,你从不开始或同时停止测量,因此有一些过多的数据)
  • 实际执行乘法
  • 将结果作为新的类对象返回

接下来还有其他功能,你可以猜出他们做了什么:plot,lpf,mean,getTimeAtIndex,getIndexAtTime,...

这让我可以简单地做

signalsLabview = importLabViewSignals(LabViewData);
signalsMatlab = importMatlabSignals(MatlabData, 100); %hz

hydrPower = signalsLabview.flow * signalsMatlab.pressure;
plot(hydrPower);

或类似的事情。如果你有很多这些信号需要做一些数学运算,这确实有助于产生清晰的代码。否则,你有很多通用代码只是为了进行同步,移位,修剪每个操作。此外,为了快速检查事情,这很容易。

如果你必须做很多事情,我认为花一些时间来建立一个合适的框架绝对值得。

不幸的是,我不认为我可以透露这些代码(IP等),但这不是火箭科学。