数组中元素的平均值

时间:2015-12-02 04:49:24

标签: arrays matlab

所以我对MatLab相对较新,我被分配了任务来查找数组中第一行或最后一行以及第一列或最后一列中所有元素的平均值。我的功能如下:

function [ myavg ] = avg_outer( array_in )
%UNTITLED2 Summary of this function goes here
%   Detailed explanation goes here

[rowsin, colin]=size(array_in);
sum=0;
numelement=0;
currentpos=1;
currentrow=1;
j=1;
while currentpos>1 && currentpos<rowsin
    sum=sum+array_in(currentrow,1)+array_in(currentrow,colin);
    numelement=numelement+2;
    currentrow=currentrow+1;
    if currentrow==1
        for j=1:1:colin
            sum=sum+array_in(currentrow,j);
            numelement=numelement+1;
        end
    elseif currentrow==rowsin
                sum=sum+array_in(currentrow,j);
                numelement=numelement+1;
    end
end
    myavg=sum/numelement;
end

当我使用随机数组运行函数时,我没有得到结果。

关于我哪里出错的任何帮助或想法?

2 个答案:

答案 0 :(得分:1)

假设我正确阅读了问题陈述,你可以创建一个在边框周围为true的掩码,在中间为false,并取掩码版本A的平均值。

function [out_avg] = avg_outer(A)
  mask = true(size(A));
  mask(2:end-1,2:end-1) = false;
  out_avg = mean(A(mask));

我无法真正按照您发布的代码中的逻辑进行调试,抱歉。希望这个答案能够向您展示矢量化Matlab代码的一些优点。

答案 1 :(得分:1)

正确的方法是根据@kmac的回答。但是与循环代码特别相关,存在多个问题。

  1. currentpos1开始,这意味着永远不会输入while循环,因为currentpos > 1为false。这就是为什么你得到NaN作为答案的原因。
  2. 即使修复了上述内容,您也永远不会增加currentpos,因此永远不会退出while循环(或更正确地执行,直到发生越界错误)。
  3. 即使修好了上述内容,第一次进入while循环(在循环的第3行),你currentrow = currentrow + 1;,即2,意味着后续的{{1} } statement始终为false,并且您不会对矩阵的第一行求和。
  4. 即使您修正了上述问题,if循环也会添加第一行的所有元素,但您已经考虑了该行的第一个和最后一个元素,因此您需要添加他们两次进入总和。
  5. 即使你修正了上述内容,当for,即最后一行,你也没有currentrow == rowsin循环来对行的元素进行实际求和。注意到您不想要第一个和最后一个元素,因为您已经添加了它们。