[Rd] Matrix memory layout R vs. C

Luis Carvalho lexcarvalho at gmail.com
Fri Dec 6 15:23:13 CET 2013


Hi Larissa,

> I'm trying to pass a matrix from R to C, where some computation is
> done for performance reasons, and back to R for evaluation. But I've
> run into the problem that R and C seem to have different ways of
> representing the matrix in main memory. The C representation of a 2D
> matrix in linear memory is concatenation of the rows whereas in R,
> it's a concatenation of the columns.  That leads to the problem.

<snip>

R uses column-major order [1] because that's the order used by FORTRAN and R
uses many libraries with a FORTRAN interface (most important: BLAS and LAPACK
for numerical linear algebra.) That's the situation with many other languages
/ libraries that use similar interfaces, such as MATLAB, Octave, Julia, and
Scilab [1]. So, there's no way around it and you just have to get used to
referencing matrix entries in col-major order.

[1] http://en.wikipedia.org/wiki/Row-major_order


> Here's an example of C code that simply prints the matrix it gets from R:

<snip>

Try this instead:

#include <stdlib.h>
#include "R.h"

void printMatrix(int *mPtr, int m, int n) {
  int j,k;

  for(j = 0; j < m; j++){
    for(k = 0; k < n; k++) {
      printf("%d\t", mPtr[j + m * k]);
    }
    printf("\n");
  }
}

> No matter if you create the matrix with byrow=TRUE or FALSE, C
> always interprets it the other way round. Is there a way to avoid
> this? I've read previous posts on passing a matrix from R to C, but
> the essence of the answers was that "a matrix in R is just a vector
> with attributes", but I don't see how this helps. Maybe someone can
> clarify.

Specifying byrow=TRUE only changes how the matrix is *read*, not how it's
stored. A matrix -- and, more generally, an array -- is in fact just a vector
with (dimension) attributes, but that just specifies the memory layout of the
matrix, and not its representation (that is, it doesn't help.) Unfortunately,
there's no way to avoid this, but it shouldn't be too bad to get used to it.
:)

Cheers,
Luis

-- 
Computers are useless. They can only give you answers.
                -- Pablo Picasso

-- 
Luis Carvalho (Kozure)
lua -e 'print((("lexcarvalho at NO.gmail.SPAM.com"):gsub("(%u+%.)","")))'



More information about the R-devel mailing list