# [SciPy-user] array vs matrix, converting code from matlab

Travis Oliphant oliphant at ee.byu.edu
Thu Apr 20 15:44:06 CDT 2006

Gennan Chen wrote:

>Hi! Travis,
>
>
> >> d = [0:23]
> >> k = reshape(d, 3,4,2)
>k(:,:,1) =
>0  3  6  9
>1  4  7  10
>2  5  8  11
>k(:,:,2) =
>12  15  18  21
>13  16  19  22
>14  17  20  23
>
>
>

This is a FORTRAN-order reshaping.   The linear sequence of values is
reshaped into an array by varying the first index (the row) the fastest.

NumPy, by default, uses C-contiguous order so that the last index varies
the fastest as it places elements in the array.

NumPy does have support for the FORTRAN-order, but there are a few
constructs that don't support it: (arr.flat iterators are always in
C-contiguous order and a.shape = (3,4,2) always assumes C-contiguous
order for advancing through the elements).   I don't know of anyone who
has used the FORTRAN  support to successfully convert MATLAB code  so
unless you want to be a guinea pig, you might want to just hunker down
and convert to C-contiguous order.  Alternatively you can just re-think
the shape of your arrays in reverse:  i.e. instead of creating a 3,4,2
array,  create a 2,4,3 array and reverse all your indices.

>So, if I want to port my Matlab code, I need to pay attention to
>this. And Since I  have a lot of C/C++  mexing code in Matlab, I need
>to fix not just 1-0 based but also indexing issue here. Any chance I
>can make the indexing like the Matlab's way?  Or I should just hunker
>down...
>
>
As far as the indexing is concerned.  The only way to alter it is to
implement a new class that subtracts 1 from all the indices.  You could
also define "end" as a simple object and when you see it replace with
the number of dimension in the array.   Such a thing is possible (you
could also implement it to reverse the order of all your indices and
simulate a matlab-style array).

-Travis