如何添加标准偏差和移动平均线

时间:2018-05-23 07:36:54

标签: matlab

我想要的是: 我有一个包含32个txt文件和1个excle文件的文件夹,每个文件包含两列中的一些数据:时间,级别。

我已设法从文件夹中提取数据并打开Matlab中的每个文件并从中获取数据。我需要做的是为每个数据文件创建绘图。 32个地块中的每一个都应该有:

  1. 随时间变化的平均值
  2. 标准差
  3. 有了这两件事我无法实现。 此外,我需要制作另一个情节,这个情节应该包含所有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 cell
    • *时间和等级是22973x1双倍。

1 个答案:

答案 0 :(得分:0)

你需要替代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);

由于蓝线重叠,它应该显示一条红线。