Note that there are some explanatory texts on larger screens.

plurals
  1. POVectorize matrix operation in R
    primarykey
    data
    text
    <p>I have a R x C matrix filled to the k-th row and empty below this row. What i need to do is to fill the remaining rows. In order to do this, i have a function that takes 2 entire rows as arguments, process these rows and output 2 fresh rows (these outputs will fill the empty rows of the matrix, in batches of 2). I have a fixed matrix containing all 'pairs' of rows to be processed, but my for loop is not helping performance:</p> <pre><code># the processRows function: processRows = function(r1, r2) { # just change a little bit the two rows and return it in a compact way nr1 = r1 * 0.1 nr2 = -r2 * 0.1 matrix (c(nr1, nr2), ncol = 2) } # M is the matrix # nrow(M) and k are even, so nLeft is even M = matrix(1:48, ncol = 3) # half to fill (can be more or less, but k is always even) k = nrow(M)/2 # simulate empty rows to be filled M[-(1:k), ] = 0 cat('before fill') print(M) # number of empty rows to fill nLeft = nrow(M) - k nextRow = k + 1 # each row in idxList represents a 'pair' of rows to be processed # any pairwise combination of non-empty rows could happen # make it reproducible set.seed(1) idxList = matrix (sample(1:k, k), ncol = 2, byrow = TRUE) for ( i in 1 : (nLeft / 2)) { row1 = M[idxList[i, 1],] row2 = M[idxList[i, 2],] # the two columns in 'results' will become 2 rows in M results = processRows(row1, row2) # fill the matrix M[nextRow, ] = results[, 1] nextRow = nextRow + 1 M[nextRow, ] = results[, 2] nextRow = nextRow + 1 } cat('after fill') print(M) </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload