Documentation>C API
Andrea Vedaldi

This page summarizes some of the conventions used by the library.

Matrix and image storage conventions

If not otherwise specified, matrices in VLFeat are stored in memory in column major order. Given a matrix \([A_{ij}] \in \real^{m \times n}\), this amounts of enumerating the elements one column per time: \(A_{11}, A_{21}, \dots, A_{m1}, A_{12}, \dots, A_{mn}\). This convention is compatible with Fortran, MATLAB, and popular numerical libraries.

Matrices are often used in the library to pack a number data vectors \(\bx_1,\dots,\bx_n \in \real^m\) of equal dimension together. These are normally stored as the columns of the matrix:

\[ X = \begin{bmatrix} \bx_1, \dots, \bx_n \end{bmatrix}, \qquad X \in \real_{m\times n} \]

In this manner, consecutive elements of each data vector \(\bx_i\) is stored in consecutive memory locations, improving memory access locality in most algorithms.

Images \(I(x,y)\) are stored instead in row-major order, i.e. one row after the other. Note that an image can be naturally identified as a matrix \(I_{yx}\), where the vertical coordinate \(y\) indexes the rows and the horizontal coordinate \(x\) the columns. The image convention amounts to storing this matrix in row-major rather than column-major order, which is in conflict with the rule given above. The reason for this choice is that most image processing and graphical libraries assume this convention; it is, however, not the same as MATLAB's.