Matlab IF和ELSEIF循环

时间:2014-03-14 09:15:08

标签: matlab

function final  = fcn(sensor1, sensor2, sensor3)

% resolution = res
res = 10;


% value1 = ((sensor1+sensor2+sensor3)/3);
% | is used for 'or' command

if
   sensor1 > res+sensor2 | sensor1> res+sensor3;
   value1 = ((sensor2+sensor3)/2);

elseif
   sensor2 > res+sensor1 | sensor2> res+sensor3;
   value1 = ((sensor1+sensor3)/2);

elseif
   sensor3 > res+sensor1 | sensor3> res+sensor2;
   value1 = ((sensor1+sensor2)/2);

else
    value1 = ((sensor1+sensor2+sensor3)/3);

end


final = value1;

我希望它根据平均值显示最终值。如果任何单个值大于其他两个值中的任何一个(在这种情况下为分辨率),那么它应该忽略该数字并仅使用其他两个的平均值。在matlab上,我的IF和ELSEIF循环有一个错误,表示'解析错误,并在其他地方解析错误。

2 个答案:

答案 0 :(得分:2)

你应该让if和你的条件在同一条线上。条件之后没有半结肠:

.
.
.
if sensor1 > res+sensor2 || sensor1> res+sensor3
   value1 = ((sensor2+sensor3)/2);

elseif sensor2 > res+sensor1 || sensor2> res+sensor3
   value1 = ((sensor1+sensor3)/2);
.
.
.

顺便说一句,在这种情况下你应该使用||,因为你正在处理标量。

答案 1 :(得分:0)

你可以用一些矢量化的方法去掉几乎所有的条件语句。此外,如果您有许多传感器作为具有相同条件的输入,它将自动缩放。

<强>代码

function value  = fcn(sensor1, sensor2, sensor3)

res = 10;

sensor = [sensor1;sensor2;sensor3];
ind_first_cond_met = find(any(bsxfun(@gt,sensor,(res+sensor)'),2),1,'first');

if isempty(ind_first_cond_met)
    value = mean(sensor);
else    
    sum_mat = bsxfun(@plus,sensor,sensor');
    mean_every_other_two = [sum_mat(1,2) sum_mat(2,3) sum_mat(3,1)]./2;
    value = mean_every_other_two(ind_first_cond_met);
end