On Thu, 8 Nov 2012 06:35:10 -0700,Christian Gunning <icos.atropa at gmail.com> wrote:
[1 <text/plain; UTF-8 (quoted-printable)>] Interesting thread. I had no idea the speed differences were that significant. I'm curious -- are there obvious use-cases where staying in column-major is *not* possible via careful setup?
I am sure staying with column-major is possible. Fortran also has column-major order and a lot of things are (anything is ? ;-) possible with Fortran. But when writing loops and traversing matrices and structs I (so this might just be me) am used to thinking about row-major order.
I realize it's a minimal test-case, but the cost of memory allocation in the above example dominates.
Hummm... interesting. Thanks for the example. I'll play with it for my stuff. Best, R.
Compare with:
byRow_inplace <- cxxfunction(signature(xm_ = "numeric"),
body = '
//int m = as<int>(dm);
//NumericMatrix xm(m, m);
NumericMatrix xm(xm_);
int m = xm.nrow();
int i;
int j;
for(i = 0; i < m; i++) {
for(j = 0; j < m; j++) {
xm(i, j) = i * m + j;
}
}
',
plugin = "RcppArmadillo",
verbose = TRUE)
nn <- 10000 aa <- matrix(nn, nrow=nn, ncol=nn)
res <- benchmark(byRow(nn), byRow_inplace(aa),
columns=c("test", "replications", "elapsed", "relative",
"user.self", "sys.self"),
order="relative", replications=10)
best, Christian
I thought that, for any of the Matrix types available, if we have
x(i, j) then x(i, j + 1) would be contiguous in memory (whereas x(i + 1, j) could be extremely far away, depending on the size of the matrix). However, it seems that with Matrix objects it is the other way around, so that x(i, j) is next to x(i + 1, j), not to x(i, j + 1):
-- A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal ? Panama! [2 <text/html; UTF-8 (quoted-printable)>]
Ramon Diaz-Uriarte
Department of Biochemistry, Lab B-25
Facultad de Medicina
Universidad Aut?noma de Madrid
Arzobispo Morcillo, 4
28029 Madrid
Spain
Phone: +34-91-497-2412
Email: rdiaz02 at gmail.com
ramon.diaz at iib.uam.es
http://ligarto.org/rdiaz