【问题标题】:Errors creating plots/averaging创建图/平均的错误
【发布时间】:2011-12-24 12:27:47
【问题描述】:

有人能告诉我为什么我的一个图形(蓝色)没有显示在绘图上,而另一个(黑色)开始得太早(为了避免这种情况,我尝试将这些值设置为 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-');

【问题讨论】:

  • 能否请您提供 x、y1、y2 和 z 的姓名?
  • 这里z1z2的目的是什么?
  • 此外,您确实意识到,由于您没有在循环中修改 soma_21mt 并且循环根本不依赖于 i,因此循环要么是完全冗余的(您是基本上是在做x=1+2 一百万次),或者循环没有做你想做的事情?
  • 我是 matlab 新手。其中谁是 131x1 1048 双。是的,我现在的目标并没有做我真正想做的事情。我有一列有年份,另一列有某些值。我想制作一个平均为 21 年的图形,所以不能考虑第一个和最后 10 个值,因此是 NaN。
  • 我已将循环更改为: for i = y1(11): y1(121);对于 j = i-10:i+10; media_21tm = 平均值 (j); end end 但现在我得到一堆水平排列的黑点

标签: matlab plot average


【解决方案1】:

z 和 y1 在您的代码示例中是相同的。所以蓝线和黑线是一样的。因此,蓝色线隐藏在黑色线下方,因为黑色线是最后创建的。由于 Tobold 修复了一些 z 值的 NaN,我怀疑您会看到一条蓝/黑/蓝线。

如前所述,您的 for 循环实际上并没有做任何事情。但是,如果您尝试在 z 上执行简单的运行平均滤波器,请尝试以下操作。 Matlab filter function

windowSize = 21;
z = filter(ones(1,windowSize)/windowSize,1,y1);

我更喜欢 Matlab 的 filtfilt() 函数,因为它是一个正向和反向滤波器,但需要信号处理工具箱。

编辑:另外作为一个注释,因为这是一个未初始化的过滤器,第一个 windowssize-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

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

【讨论】:

    【解决方案2】:

    您没有在 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 循环似乎也没有完成我认为你想要的。

    【讨论】:

    • 现在我的图形的一部分是蓝色的,其余的是黑色的。有了这个改变,我想我明白问题所在了。
    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多