创建绘图/平均的错误

时间:2011-12-24 12:27:47

标签: matlab plot average

有人可以告诉我为什么我的一个图形(蓝色)没有显示在情节上而另一个(黑色)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-');

2 个答案:

答案 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

我可能仍会使用过滤器功能而不是上面的代码,并学习如何初始化所述过滤器。但至少应该告诉你如何索引数组。