Tuesday, February 12, 2013

Matlab: How to get the right bar for Windows and UNIX systems

Windows systems use the backslash bar "\" to separate folders in a path string, while, on the other hand, the normal slash "/" is the one used on Mac OS X/Linux (in general unix) systems.
Even if it's not a big deal since Matlab can handle it, I find it quite disturbing so I wrote this simple code to address the issue.


function [bar]=getbar
% [bar]=getos
% bar="/" for unix systems and bar="\" for Windows systems


os=lower(getenv('OS'));

if (isempty(findstr(os, 'windows')))
    %It's a unix system
    bar="/";
else
    % It's a Windows system
    bar="\";
end


Saturday, February 2, 2013

Python: how "range" really works

In this post, I gonna show you - with some very simply examples - how the python built-in function range works!

Let's start with the official official python help:

>>>help(range)

Help on built-in function range in module __builtin__:

range(...)
    range([start,] stop[, step]) -> list of integers
   
    Return a list containing an arithmetic progression of integers.
    range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
    When step is given, it specifies the increment (or decrement).
    For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
    These are exactly the valid indices for a list of 4 elements.


Basically the list of integers is built with the following simple rules:

1) The list starts with start, an optional parameter having 0 as its default value
3) The step of the elements is given by step, an optional parameter having 1 as its default value
2) The last element is ALWAYS smaller than stop!

If N indicates the overall number of elements in the list, each element a_i  is calculated according to the rule:

a_i = start + step*(i-1)

and the last element MUST be smaller than stop:

a_N = start + step *(N-1) < stop

as a consequence...

N  <1+ (stop-start)/step

The result of 1+(stop-start)/step can be an interger or decimal number doesn't matter. The important thing is that N is integer and smaller than 1+(start - start)/step

Understood? Let's see the examples!

1) What is the output for range(1,9,2)?

start=1
stop=9
step=2

N<1+(stop-start)/step =1 + (9-1)/2=5 hence N=4! Indeed...

>>>>range(1,9,2)
[1, 3, 5, 7]

2) What is the output for range(1,8,2)?
start=1
stop=8
step=2

N < 1+(stop-start)/step =1 + (8-1)/2=4.5 hence N=4! Indeed...

>>>>range(1,8,2)
[1, 3, 5, 7]


3) What is the output for range(9)?
start=0 [default]
stop=9
step=1 [default]

N < 1+(stop-start)/step =1 + (9-1)/1=9 hence N=8! Indeed...

>>>>range(9)
[0, 1, 2, 3, 4, 5, 6, 7, 8]

4) What is the output for range(9,3,-2)?
start=9
stop=3
step=-2

N < 1+(stop-start)/step =1 + (3-9)/(-2)=4 hence N=3! Indeed...

>>>>range(9,3,-2)
[9, 7, 5, 4]

NOTE:
N represents the TOTAL number of elements but python labels them starting from 0 and ending at (N-1)!