I just stumbled on another reason to dislike Matlab: the stupid inconsistency of the short-circuit behavior of the elementwise logical operators: the statement

fun(2) | fun(9999)

does not short-circuit, so both fun(2) and fun(9999) are executed, but when used in an if or while expression like

if fun(2) | fun(9999); end;

the expression does short-circuit, meaning that only fun(2) is executed.

I know, you also have the || and && operators, which are defined as short circuiting operators, but the inconsistency with the | and & operators is just stupid, if not evil.

For example, say that function fun(x) is defined as

function y = fun(x)
    disp(sprintf('  --> called fun(%d)', x));
    y = x;
end

and we execute the script

disp('fun(2) | fun(9999);')
fun(2) | fun(9999);

disp('if fun(2) | fun(9999); end;')
if fun(2) | fun(9999); end;

disp('fun(2) || fun(9999);')
fun(2) || fun(9999);

disp('if fun(2) || fun(9999); end;')
if fun(2) || fun(9999); end;

In Matlab (R2007a), I get:

fun(2) | fun(9999);
  --> called fun(2)
  --> called fun(9999)
if fun(2) | fun(9999); end;
  --> called fun(2)
fun(2) || fun(9999);
  --> called fun(2)
if fun(2) || fun(9999); end;
  --> called fun(2)

See? With the first |-statement, there are two fun() calls and with the second |-statement, there is only one. And they even dare to call this a feature in the Matlab documentation. Another proof that Matlab is a horrible programming environment.

Funnily, the open source Matlab-replacement Octave gets it right and shows consistency:

fun(2) | fun(9999);
  --> called fun(2)
  --> called fun(9999)
if fun(2) | fun(9999); end;
  --> called fun(2)
  --> called fun(9999)
fun(2) || fun(9999);
  --> called fun(2)
if fun(2) || fun(9999); end;
  --> called fun(2)

Anyway, I'm happy I decided to leave Matlab (unless forced to use it) and switched to Python+Scipy.