Как добавить стандартное отклонение и скользящее среднее - PullRequest
0 голосов
/ 23 мая 2018

То, что я хочу, это: я получил папку с 32 txt файлами и 1 excle файлом, каждый файл содержит некоторые данные в двух столбцах: время, уровень.

Мне уже удалось вытащитьданные из папки и откройте каждый файл в Matlab и получите данные из него.Что мне нужно сделать, это создать график для каждого файла данных.каждый из 32 участков должен иметь:

  1. Среднее изменение во времени
  2. Стандартное отклонение

С обоими этими вещами я не могу справитьсясделай так, чтоб это работало.также мне нужно сделать еще один график, на этот раз график должен иметь среднее значение за каждую минуту из всех 32 файлов.

Вот мой код до сих пор:

clc,clear;
myDir = 'my path';
dirInfo = dir([myDir,'*.txt']);
filenames = {dirInfo.name};
N = numel(filenames);
data=cell(N,1); 
for i=1:N
    fid = fopen([myDir,filenames{i}] );
    data{i} = textscan(fid,'%f %f','headerlines',2);
    fclose(fid);
    temp1=data{i,1};
    time=temp1{1};
    level=temp1{2};
    Average(i)=mean(level(1:find(time>60)));
    AverageVec=ones(length(time),1).*Average(i);
    Standard=std(level);
    figure(i);
    plot(time,level);
    xlim([0 60]);
    hold on
    plot(time, AverageVec);
    hold on
    plot(time, Standard);
    legend('Level','Average','Standard Deviation')
end 

основная проблема сэтот код состоит в том, что я получаю только среднее значение за все 60 секунд, а не скользящее среднее, и стандартное отклонение ничего не возвращает.

несколько вещей, которые вам нужно знать:

  • * temp1 равен 1x2ячейка
  • * время и уровень удваиваются 22973x1.

1 Ответ

0 голосов
/ 24 мая 2018

Очевидно, вам нужна альтернатива movmean и movstd, поскольку они были введены в 2016a.Я объединил предложение от @bla с двумя циклами, которые корректируют краевые эффекты.

function [movmean,movstd] = moving_ms(vec,k)
if mod(k,2)==0,k=k+1;end
L = length(vec);
movmean=conv(vec,ones(k,1)./k,'same');
% correct edges
n=(k-1)/2;
movmean(1) = mean(vec(1:n+1));
N=n;
for ct = 2:n
    movmean(ct) = movmean(ct-1) + (vec(ct+n) - movmean(ct-1))/N;
    N=N+1;
end
movmean(L) = mean(vec((L-n):L));
N=n;
for ct = (L-1):-1:(L-n)
    movmean(ct) = movmean(ct+1) + (vec(ct-n) - movmean(ct+1))/N;
    N=N+1;
end

%mov variance
movstd = nan(size(vec));
for ct = 1:n
    movstd(ct) = sum((vec(1:n+ct)-movmean(ct)).^2);
    movstd(ct) = movstd(ct)/(n+ct-1);
end
for ct = n+1:(L-n)
    movstd(ct) = sum((vec((ct-n):(ct+n))-movmean(ct)).^2);
    movstd(ct) = movstd(ct)/(k-1);
end
for ct = (L-n):L
    movstd(ct) = sum((vec((ct-n):L)-movmean(ct)).^2);
    movstd(ct) = movstd(ct)/(L-ct+n);
end
movstd=sqrt(movstd);

Кто-то с matlab> = 2016a может сравнить их, используя:

v=rand(1,1E3);m1 = movmean(v,101);s1=movstd(v,101);
[m2,s2] = moving_ms(v,101);
x=1:1E3;figure(1);clf;
subplot(1,2,1);plot(x,m1,x,m2);
subplot(1,2,2);plot(x,s1,x,s2);

Это должно показатьодиночная красная линия, поскольку синяя линия перекрывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...