使用循环如何在每行中取3个值的平均值?

时间:2015-09-25 08:11:33

标签: matlab loops if-statement

我给出了一个类似于此但更长的矩阵。在计算平均值时,我会忽略nan个值。 我遇到的问题是我的输出只是最后一行的平均值,我希望每行为我提供一个单独的平均值。

请告诉我是否应该澄清更多信息!

shortmeasurements = [ 300 301 303;

 301 302 nan;

 304 307 306;

 nan 303 306;

nan 301 nan;]

我想我的mean行收到了错误消息。 Tube代表 n -by- 3 矩阵我取平均值。

failcount = 0; %//initialize variables
flag = false;


for n = (1:size(Tube,1)) %//number of elements in first row
    if all(isnan((Tube(1,:))))== 1 %// if all values in row 1 are NaN
        failcount = failcount + 1; %//fail count + 1

        if failcount == 1 %//first time through loop
            airSpeed = isnan; %//airspeed nan
        else 
            airSpeed(n,1) = (airSpeed( n-1,1)) %//previous air speed
        end
    else
        airSpeed = mean(Tube(n,~isnan(Tube(n,:)))); %//taking the mean

2 个答案:

答案 0 :(得分:5)

对于没有nan的平均值,您可以使用nanmean

y = nanmean(shortmeasurements,dim)

其中shortmeasurements是您的数据集,dim指定您想要平均值的维度。 1设置为每列平均值(默认值),2设置为每行平均值。

因此,对于您的完整数据集:

airspeed = nanmean(Tube,2);

并且您不必使用此单行对nan进行任何其他检查。

试运行:

airspeed = nanmean(shortmeasurements,2)

airspeed =

  301.3333
  301.5000
  305.6667
  304.5000
  301.0000

如果您没有安装统计工具箱,请不要担心! MathWorks已实现该功能,以便在mean(和maxmin等)本身的搜索中省略nans:

A = [1 0 0 1 NaN 1 NaN 0];
M = mean(A,'omitnan')
M = 
    0.5000

答案 1 :(得分:2)

问题是在某些行中你使用

airSpeed(n, 1) = ...

但在其他人中你使用

airSpeed = ...

所有这些行都应该是

airSpeed(n, 1) = ...

否则您将覆盖这些值,并在遇到

时仅存储1个值
airSpeed = ...

这就是为什么只存储最后一行的平均值。