Matlab 查找数组的每个元素与其直接相邻元素之间的平均值

Matlab 查找数组的每个元素与其直接相邻元素之间的平均值,matlab,matrix,average,Matlab,Matrix,Average,假设我有一个矩阵1a1,它是1 x n,我想找到a的每个元素与其相邻元素之间的平均值 做这件事的聪明方法是什么 例: 如果 那么“平均值矩阵”是: 其中b的第一个条目是: b(1) = (0+1)/2 = 0.5 b(2) = (0+1+2)/3 = 1 等等。我建议将中间部分作为向量运算,并将边缘条件作为标量处理 b=zeros(size(a)); b(2:end-1)=(a(1:end-2)+a(2:end-1)+a(3:end))/3; b(1)=(a(1)+a(

假设我有一个矩阵1a1,它是1 x n,我想找到
a
的每个元素与其相邻元素之间的平均值

做这件事的聪明方法是什么

例:

如果

那么“平均值矩阵”是:

其中
b
的第一个条目是:

b(1) = (0+1)/2 = 0.5
b(2) = (0+1+2)/3 = 1

等等。

我建议将中间部分作为向量运算,并将边缘条件作为标量处理

    b=zeros(size(a));
    b(2:end-1)=(a(1:end-2)+a(2:end-1)+a(3:end))/3;
    b(1)=(a(1)+a(2))/2;
    b(end)=(a(end-1)+a(end))/2;
如果你进入更大的平均值

    % scale and sum elements with a sliding window 3 long.
    b=conv(a,[1,1,1]/3)
    %
    % remove the tails
    b=b(2:end-1)
    % 
    % and rescale the edge cases.
    b(1)=b(1)*3/2
    b(end)=b(end)*3/2
我比较了上面的第一种方法(向量法)、卷积法和RDIZL3建议的hankel法。(抱歉,Luis,我没有统计软件包,尽管我预计nanmean方法会因为条件检查的数量而变慢。)比较是使用10000长度的随机a向量,以使时间意义重大。在这些计时之前,b被初始化为正确大小的零矩阵。在这些计时之前,也预计算了正确大小的汉克尔矩阵(h)

    % hankle method
    tic; b(1)=mean(a([1,2])); b(2:(n-1))=mean(a(h),2); b(2)=mean(a([n-1,n])); toc
    Elapsed time is 0.001698 seconds.
    % convolution method
    tic; c=conv(a,[1,1,1]/3) ; b=c(2:(2+n-1)); b(1)=b(1)*3/2; b(n)=b(n)*3/2; toc;
    Elapsed time is 0.000339 seconds.
    % vector method
    tic; b(1)=mean(a([1,2])) ; b(2:(n-1))=(a(1:(n-2))+a(2:(n-1))+a(3:n))/3;b(2)=mean(a([n-1,n])); toc
    Elapsed time is 0.000914 seconds.
我重复了以上3次,并对结果进行了排序

    hankel       convolution  vector
    9.2500e-04   3.3900e-04   7.2600e-04
    1.3820e-03   5.2600e-04   8.7100e-04
    1.6980e-03   5.5200e-04   9.1400e-04
    2.1570e-03   5.5300e-04   2.6390e-03
我有点惊讶,我没想到卷积方法的效率会在更大的窗口大小之前显现出来。但它在这里一直做得最好

请注意,如果使用较小的数据集,则这些计时可能不合适。如果对大量短长度向量感兴趣,那么如果hankel方法效果更好,我一点也不会感到惊讶。

您可以使用以下方法:

a=[0 1 2 1 0 1];
n = numel(a);
h = hankel(1:(n-2),(n-2):n);
b(1) = mean(a([1 2]))
b(2:(n-1)) = mean(a(h),2);
b(n) = mean(a([n-1 n]))
这将返回向量:

b =  [0.5000    1.0000    1.3333    1.0000    0.6667    0.5000]
这将从向量
a
中获取元素,并找到其相邻元素的平均值,因此:

b(1) = (0+1)/2 = 0.5
b(2) = (0+1+2)/3 = 1
b(3) = (1+2+1)/3 = 1.3333
b(4) = (2+1+0)/3 = 1
b(5) = (1+0+1)/3 = 0.6667
b(6) = (0+1)/2 = 0.5 % last element 

使用平滑过滤器的最简单方法

output=smooth(A,3,'moving');
其中3是窗口大小(应为奇数值)

检查文档中的平滑功能

b(1) = (0+1)/2 = 0.5
b(2) = (0+1+2)/3 = 1
b(3) = (1+2+1)/3 = 1.3333
b(4) = (2+1+0)/3 = 1
b(5) = (1+0+1)/3 = 0.6667
b(6) = (0+1)/2 = 0.5 % last element 
a = [0 1 2 1 0 1]; %// data
n = 1; %// how many neighbours to consider on each side

a2 = [NaN(1,n) a NaN(1,n)]; %// pad with NaN's (which will be ignored by nanmean)
b = arrayfun(@(k) nanmean(a2(k-n:k+n)), n+1:n+numel(a)); %// apply a
%// sliding-window mean ignoring NaN's
output=smooth(A,3,'moving');