3

在 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

4

2 回答 2

3

问题是运行长度解码之一。请参阅Matlab 数组操作技巧和技巧的第 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 填充开头。

于 2012-09-29T00:10:33.423 回答
2

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

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

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

旁边还有其他函数,你可以猜出它们的作用:plot、lpf、mean、getTimeAtIndex、getIndexAtTime、...

这让我可以简单地做

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

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

或类似的事情。如果你有很多这样的信号你必须做一些数学运算,这真的很有帮助,并且会产生清晰的代码。否则,您有很多通用代码仅用于在每个操作周围进行同步、移位、修剪。也为了快速检查事情很容易。

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

不幸的是,我认为我不能公开这段代码(IP 等),但这不是火箭科学。

于 2012-09-29T07:30:14.017 回答