2014-03-14 43 views
2
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循環有一個錯誤,說'在解析錯誤,並在elseif解析錯誤。Matlab IF和ELSEIF循環

+0

如果說'傳感器1> RES + sensor2'和'傳感器2> RES + sensor3'應該發生什麼?你有沒有考慮過這種情況? – Dan

+0

那麼它將不得不考慮兩個條件的真實排除價值。如果它比任何一個都大,我想排除它。但是,謝謝 – user3419155

回答

2

你應該讓你if和你的條件在同一行。和條件後無分號:

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

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

順便說一句,你應該在這種情況下使用||,因爲你所面對的標量。

+0

這工作。謝謝 – user3419155

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