在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
答案 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中。然后我为该类实现了一个乘法,加法等方法,它自动处理所有必要的事情,是:
接下来还有其他功能,你可以猜出他们做了什么:plot,lpf,mean,getTimeAtIndex,getIndexAtTime,...
这让我可以简单地做
signalsLabview = importLabViewSignals(LabViewData);
signalsMatlab = importMatlabSignals(MatlabData, 100); %hz
hydrPower = signalsLabview.flow * signalsMatlab.pressure;
plot(hydrPower);
或类似的事情。如果你有很多这些信号需要做一些数学运算,这确实有助于产生清晰的代码。否则,你有很多通用代码只是为了进行同步,移位,修剪每个操作。此外,为了快速检查事情,这很容易。
如果你必须做很多事情,我认为花一些时间来建立一个合适的框架绝对值得。
不幸的是,我不认为我可以透露这些代码(IP等),但这不是火箭科学。