在 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/