Ошибки при создании графиков / усреднение - PullRequest
0 голосов
/ 24 декабря 2011

Может ли кто-нибудь сказать мне, почему одна из моих графиков (синяя) не отображается на графике, а другая (черная) начинается слишком рано (чтобы избежать этого, я попытался обозначить эти значения как 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-');

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

z и y1 идентичны в вашем примере кода.Таким образом, синяя линия и черная линия идентичны.Поэтому синяя линия скрыта под черной, поскольку черная была создана последней.С исправлением Tobold для NaN, выводящего некоторые значения z, я подозреваю, что вы видите синюю / черную / синюю линию.

Как уже упоминалось, ваш цикл for ничего не делает.Однако, если вы пытаетесь выполнить простой усредняющий фильтр по z, попробуйте следующее. Функция фильтра Matlab

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

Я предпочитаю функцию Matlab filterfilt (), поскольку это прямой и обратный фильтры, но для них требуется набор инструментов обработки сигналов.в качестве примечания, поскольку это неинициализированный фильтр, первые значения windowsize-1 будут перекошены.Существуют способы инициализации вашего фильтра, но это выходит за рамки вашего вопроса.

Ваш цикл for по-прежнему ничего не делает.Вам нужно индексировать в y1 с вашим i / j.Я думаю, что вы пытаетесь сделать центрированное среднее, где точка в 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 голос
/ 24 декабря 2011

Вы ничего не устанавливаете в NaN в z.Я думаю, что вы хотите сделать, это

    z(1:10) = NaN;
    z(154:length(z)) = NaN;

вместо

    z1 = z(1:10);
    z2 = z(154:length(z));
    z1 = NaN;
    z2 = NaN;

Также ваш цикл for, кажется, не выполняет то, что я думаю, вы хотите.

...