Huang-Wen Chen
2006-Oct-09 21:21 UTC
[R] shifting a huge matrix left or right efficiently ?
I'm wondering what's the best way to shift a huge matrix left or right. My current implementation is the following: shiftMatrixL <- function(X, shift, padding=0) { cbind(X[, -1:-shift], matrix(padding, dim(X)[1], shift)) } X <- shiftMatrixL(X, 1)*3 + shiftMatrixL(X,2)*5... However, it's still slow due to heavy use of this function. The resulting matrix will only be read once and then discarded, so I believe the best implementation of this function is in C, manipulating the internal data structure of this matrix. Anyone know similar package for doing this job ? Huang-Wen
If you're able to work with the transpose of your matrix, you might consider the function 'filter()', e.g.: > filter(diag(1:5), c(2,3), sides=1) Time Series: Start = 1 End = 5 Frequency = 1 [,1] [,2] [,3] [,4] [,5] 1 NA NA NA NA NA 2 3 4 0 0 0 3 0 6 6 0 0 4 0 0 9 8 0 5 0 0 0 12 10 > I don't know if the conversion to and from a time-series class will impact the timing, but if this might serve your purposes, it's easy to do some experiments to find out. - Tony Plate Huang-Wen Chen wrote:> I'm wondering what's the best way to shift a huge matrix left or right. > My current implementation is the following: > > shiftMatrixL <- function(X, shift, padding=0) { > cbind(X[, -1:-shift], matrix(padding, dim(X)[1], shift)) > } > > X <- shiftMatrixL(X, 1)*3 + shiftMatrixL(X,2)*5... > > However, it's still slow due to heavy use of this function. > The resulting matrix will only be read once and then discarded, > so I believe the best implementation of this function is in C, > manipulating the internal data structure of this matrix. > Anyone know similar package for doing this job ? > > Huang-Wen > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
Charles C. Berry
2006-Oct-09 23:43 UTC
[R] shifting a huge matrix left or right efficiently ?
A little algebra up front can often help. Note that X <- shiftMatrixL(X, 1)*3 + shiftMatrixL(X,2)*5 (and similarly with more terms on the r.h.s) is just X <- X %*% mat where mat is is a matrix of zeroes except that mat[ i+1, i ] == 3 mat[ i+2, i ] == 5 and dim(mat) == dim(X). So forget about explicitly shifting the matrix if you do this in native R - just construct a suitable version of mat and use '%*%'. If you must do this in C shift coefficient vector implicitly using a pointer before finding the inner product with each row, and if the matrix is truly large follow Tony Plate's advice to transform X first (and look at Chapter 1 of Matrix Computations by Golub and Van Loan, 1996, if you need to know why). On Mon, 9 Oct 2006, Huang-Wen Chen wrote:> I'm wondering what's the best way to shift a huge matrix left or right. > My current implementation is the following: > > shiftMatrixL <- function(X, shift, padding=0) { > cbind(X[, -1:-shift], matrix(padding, dim(X)[1], shift)) > } > > X <- shiftMatrixL(X, 1)*3 + shiftMatrixL(X,2)*5... > > However, it's still slow due to heavy use of this function. > The resulting matrix will only be read once and then discarded, > so I believe the best implementation of this function is in C, > manipulating the internal data structure of this matrix. > Anyone know similar package for doing this job ? > > Huang-Wen > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >Charles C. Berry (858) 534-2098 Dept of Family/Preventive Medicine E mailto:cberry at tajo.ucsd.edu UC San Diego http://biostat.ucsd.edu/~cberry/ La Jolla, San Diego 92093-0717