[R] loop over matrix: subscript out of bounds
Rui Barradas
ru|pb@rr@d@@ @end|ng |rom @@po@pt
Wed Aug 8 18:52:07 CEST 2018
Hello,
There are now three solutions to the OP's problem.
I have timed them and the results depend on the matrix size.
The solution I thought would be better, Enrico's diag(), is in fact the
slowest. As for the other two, Eric's for loop is 50% fastest than the
matrix index for small matrices but its relative performance degrades as
the matrix becomes bigger and bigger.
library(microbenchmark)
#Enrico Schumann
mkMat_diag <- function(nr = 5, nc = 7) {
M <- matrix(0, nr, nc)
diag(M) <- -1
diag(M[, -1]) <- 1
M
}
#Eric Berger
mkMat_loop <- function(nr = 5, nc = 7) {
M <- matrix(0, nr, nc)
for(i in 2:nrow(M)) {
M[i - 1, i - 1] <- -1
M[i - 1, i] <- 1
}
M
}
#S.Ellison
mkMat_index <- function(nr = 5, nc = 7) {
M <- matrix(0, nr, nc)
i <- 1:min(nr, nc)
j <- i[i < nc]
M[ cbind(i, i) ] <- -1
M[ cbind(j, j + 1) ] <- 1
M
}
microbenchmark(
loop = mkMat_loop(),
index = mkMat_index(),
diag = mkMat_diag(),
times = 1e3
)
microbenchmark(
loop = mkMat_loop(50, 70),
index = mkMat_index(50, 70),
diag = mkMat_diag(50, 70)
)
microbenchmark(
loop = mkMat_loop(500, 700),
index = mkMat_index(500, 700),
diag = mkMat_diag(500, 700)
)
Hope this helps,
Rui Barradas
On 08/08/2018 12:59, S Ellison wrote:
>
>>>>>>> Eric Berger on Wed, 8 Aug 2018 12:53:32 +0300 writes:
>>
>>> You only need one "for loop"
>>> for(i in 2:nrow(myMatrix)) {
>>> myMatrix[i-1,i-1] = -1
>>> myMatrix[i-1,i] = 1
>>> }
>
> Or none, with matrix-based array indexing and explicit control of the indices to prevent overrun in :
>
> mkMat <- function(n=5, m=7) {
> M <- matrix(0, n,m)
> i <- 1:min(n,m)
> j <- i[i<m]
> M[ cbind(i,i) ] <- -1
> M[ cbind(j, j+1) ] <- 1
> M
> }
>
>
>
>
> *******************************************************************
> This email and any attachments are confidential. Any use...{{dropped:8}}
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
>
More information about the R-help
mailing list