所以我对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
当我使用随机数组运行函数时,我没有得到结果。
关于我哪里出错的任何帮助或想法?
答案 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的回答。但是与循环代码特别相关,存在多个问题。
currentpos
从1
开始,这意味着永远不会输入while
循环,因为currentpos > 1
为false。这就是为什么你得到NaN
作为答案的原因。currentpos
,因此永远不会退出while
循环(或更正确地执行,直到发生越界错误)。while
循环(在循环的第3行),你currentrow = currentrow + 1;
,即2,意味着后续的{{1} } statement始终为false,并且您不会对矩阵的第一行求和。if
循环也会添加第一行的所有元素,但您已经考虑了该行的第一个和最后一个元素,因此您需要添加他们两次进入总和。for
,即最后一行,你也没有currentrow == rowsin
循环来对行的元素进行实际求和。注意到您不想要第一个和最后一个元素,因为您已经添加了它们。