2011-12-24 43 views
0

有人可以告诉我为什么我的一个图形(蓝色)不显示在情节和其他(黑色)过早(为了避免这种情况,我试图把这些值作为NaN和它与红色图形合作)?我认为这是因为我没有正确编写黑色的功能。我想根据我给出的数据计算21年的平均值,所以前10个记者x在图形上不能有值。 A错误创建情节/平均

 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

你可以给x,y1,y2和z的谁? – 0x90 2011-12-24 12:48:57

+0

这里'z1'和'z2'的用途是什么? – 2011-12-24 13:39:43

+2

另外,你确实意识到,由于你没有修改循环中的'soma_21mt',并且循环完全不依赖于'i',所以循环要么是完全多余的(你基本上在做'x = 1 + 2百万次),或者循环没有做你想做的事情? – 2011-12-24 13:44:31

回答

1

z和y1在您的代码示例中是相同的。所以蓝线和黑线是相同的。因此,蓝色线隐藏在黑色线之下,因为黑色线是最后创建的。随着Tobold的解决方案修正了一些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 

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

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; 

而且你的循环似乎没有完成我想你想它。

+0

现在我的图形部分是蓝色,其余部分是黑色的。有了这个改变,我想我明白了问题所在。 – Dywabo 2011-12-24 14:02:06