Jump to content

Row- and column-major order: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
No edit summary
No edit summary
Line 68: Line 68:
{{col-end}}
{{col-end}}


To select correct element one must know whether A[a][b] notation in a particular language is treated in a row-major or in a column-major mode, eg. in C foo[1][2] would result in <math>a_{12}</math>, while in Fortran it would result in <math>a_{21}</math>.
To select correct element one must know whether A[a][b] notation in a particular language is treated in a row-major or in a column-major mode, eg. in C foo[0][1] would result in <math>a_{12}</math>, while in Fortran it would result in <math>a_{21}</math>.


==Programming languages and libraries==
==Programming languages and libraries==

Revision as of 22:35, 18 October 2016

In computing, row-major order and column-major order describe methods for arranging multidimensional arrays in linear storage such as memory.

In row-major order, consecutive elements of the rows of the array are contiguously stored in memory; in column-major order, consecutive elements of the columns of the array are contiguously stored.

Array layout is critical for correctly passing arrays between programs written in different languages. It is also important for performance when traversing an array because accessing array elements that are contiguous in memory is usually faster than accessing elements which are not, due to caching. In some media such as tape or NAND flash memory, accessing sequentially is orders of magnitude faster than nonsequential access.[citation needed]

Explanation and example

This array

would be stored as follows in the two orders:

To select correct element one must know whether A[a][b] notation in a particular language is treated in a row-major or in a column-major mode, eg. in C foo[0][1] would result in , while in Fortran it would result in .

Programming languages and libraries

Programming languages or their standard libraries that support multi-dimensional arrays typically have a native row-major or column-major storage order for these arrays.

Row-major order is used in C/C++/Objective-C (for C-style arrays), Mathematica, PL/I, Pascal, Speakeasy, SAS, and C#/CLI/.Net.

Column-major order is used in Fortran, OpenGL and OpenGL ES, MATLAB,[1] GNU Octave, S-Plus,[2] R,[3] Julia,[4] Rasdaman[citation needed], Scilab.

A typical alternative is to use Iliffe vectors, which store elements in the same row contiguously (like row-major order), but not the rows themselves. They are used in Java,[5] Scala,[6] and Swift.

Support for multi-dimensional arrays may also be provided by external libraries, which may even support arbitrary orderings, where each dimension has a stride value, and row-major or column-major are just two possible resulting interpretations.

Row-major order is the default in NumPy[7] (for Python).

Torch (for Lua, which has no built-in support[8]) changed from column-major[9] to row-major[10] default order.

Transposition

As exchanging the indices of an array is the essence of array transposition, an array stored as row-major but read as column-major (or vice versa) will appear transposed. As actually performing this rearrangement in memory is typically an expensive operation, some systems provide options to specify individual matrices as being stored transposed.

For example, the Basic Linear Algebra Subprograms functions are passed flags indicating which arrays are transposed.[11]

Address calculation in general

The concept generalizes to arrays with more than two dimensions.

For a d-dimensional array with dimensions Nk (k=1...d), a given element of this array is specified by a tuple of d (zero-based) indices .

In row-major order, the last dimension is contiguous, so that the memory-offset of this element is given by:

In column-major order, the first dimension is contiguous, so that the memory-offset of this element is given by:

For a given order, the stride in dimension k is given by the multiplication value in parentheses before index nk in the right hand-side summations above.

More generally, there are d! possible orders for a given array, one for each permutation of dimensions (with row-major and column-order just 2 special cases), although the lists of stride values are not necessarily permutations of each other, e.g., in the 2-by-3 example above, the strides are (3,1) for row-major and (1,2) for column-major.

See also

References

  1. ^ MATLAB documentation, MATLAB Data Storage (retrieved from Mathworks.co.uk, January 2014).
  2. ^ Spiegelhalter et al. (2003, p. 17): Spiegelhalter, David; Thomas, Andrew; Best, Nicky; Lunn, Dave (January 2003), "Formatting of data: S-Plus format", WinBUGS User Manual (Version 1.4 ed.), Robinson Way, Cambridge CB2 2SR, UK: MRC Biostatistics Unit, Institute of Public Health, PDF document {{citation}}: Invalid |ref=harv (help)CS1 maint: location (link)
  3. ^ An Introduction to R, Section 5.1: Arrays (retrieved March 2010).
  4. ^ "Multi-dimensional Arrays". Julia. Retrieved 6 February 2016.
  5. ^ "Java Language Specification". Oracle. Retrieved 13 February 2016.
  6. ^ "object Array". Scala Standard Library. Retrieved 1 May 2016.
  7. ^ "The N-dimensional array (ndarray)". SciPy.org. Retrieved 3 April 2016.
  8. ^ "11.2 – Matrices and Multi-Dimensional Arrays". Retrieved 6 February 2016.
  9. ^ "Tensor". Retrieved 6 February 2016.
  10. ^ "Tensor". Torch Package Reference Manual. Retrieved 8 May 2016.
  11. ^ "BLAS (Basic Linear Algebra Subprograms)". Retrieved 2015-05-16.

Sources