有人可以告诉我为什么我的一个图形(蓝色)没有显示在情节上而另一个(黑色)beggins太早(为了避免这种情况我尝试将这些值作为NaN并且它与红色图形一起使用)?我认为这是因为我没有正确地为黑色编写功能。我想从我给出的数据中得出21年的平均值,因此前10个对应的x不能在图形上有值。甲
C = textscan(fid,'%f %f %f','headerlines',32,'commentstyle','--');
x = C{1};
y1 = C{2};
y2 = C{3};
z = C{2};
sum_21mt = 0;
for i = 11:153
sum_21mt = soma_21mt + z(21);
med_21mt = soma_21mt/21;
end
y1(y1==-99.99) = NaN;
y2(y2==-99.99) = NaN;
z1 = z(1:10);
z2 = z(154:length(z));
z1 = NaN;
z2 = NaN;
plot(x, y1, 'b-', x, y2, 'r-', x, z, 'k-');
答案 0 :(得分:1)
您没有在z中为NaN设置任何内容。我想你想做的是
z(1:10) = NaN;
z(154:length(z)) = NaN;
而不是
z1 = z(1:10);
z2 = z(154:length(z));
z1 = NaN;
z2 = NaN;
此外,你的for循环似乎没有完成我认为你想要它。
答案 1 :(得分:1)
z和y1在您的代码示例中是相同的。所以蓝线和黑线是相同的。因此,蓝线隐藏在黑色线下,因为黑色线最后创建。随着Tobold对NaN输出一些z值的修正,我怀疑你看到了蓝/黑/蓝线。
如上所述,你的for循环并没有真正做任何事情。但是,如果您尝试在z上执行简单的运行平均过滤器,请尝试以下操作。 Matlab filter function
windowSize = 21;
z = filter(ones(1,windowSize)/windowSize,1,y1);
我更喜欢Matlab的filtfilt()函数,因为它是一个正向和反向滤波器,但需要信号处理工具箱。
编辑:同样作为注释,因为这是一个非初始化过滤器,第一个windowsize-1值将会偏斜。有一些方法可以初始化您的过滤器,但这超出了您的问题。
你的for循环仍然没有做任何事情。您需要使用i / j索引到y1。我认为你试图做一个居中的平均值,其中z中的点等于y1 +/- 10个样本中的值的平均值。这里有一些代码可以做到这一点。
% Define half window. True window size is 2*halfWindow+1
halfWindow = 10;
% Init z to zeros.
% There will be halfWindow worth of zeros at the beginning and end of z after the loop.
z = zeros(size(y1));
%Loop starting at 11 (if halfWindow = 10) and ending 10 from the end.
for i = (1+halfWindow):(length(y1)-halfWindow)
z(i) = mean(y1(i-halfWindow:i+halfWindow)); %Take mean of current point +/- 10 samples
end
我可能仍会使用过滤器功能而不是上面的代码,并学习如何初始化所述过滤器。但至少应该告诉你如何索引数组。