dan - 1 year ago 61
R Question

# Fast way to get all pairs of matrix column element-wise products

Let's say I have a numerical

`matrix`
:

``````set.seed(1)
mat <- matrix(rnorm(1000),ncol=100)
``````

And I want to generate all vectors that are the result of the element-wise product of all unique pairs of vectors in
`mat`
.

Is there anything faster than this:

``````all.pairs <- t(combn(1:ncol(mat),2))
res <- do.call(cbind,lapply(1:nrow(all.pairs),function(p)  mat[,all.pairs[p,1]]*mat[,all.pairs[p,2]]))
``````

Thanks

Answer Source

Of course there is:

``````n <- ncol(mat)
lst <- lapply(1:n, function (i) mat[,i] * mat[,i:n])
do.call(cbind, lst)
``````

Here is a even fast way to go:

``````n <- ncol(mat)
j1 <- rep.int(1:n, n:1)
j2 <- sequence(n:1) - 1L + j1
mat[, j1] * mat[, j2]
``````

Note, the above will include the multiplication of a column to itself. If you want to forbid that, use

``````n <- ncol(mat)
lst <- lapply(1:(n-1), function (i) mat[,i] * mat[,(i+1):n])
do.call(cbind, lst)
``````

and

``````n <- ncol(mat)
j1 <- rep.int(1:(n-1), (n-1):1)
j2 <- sequence((n-1):1) + j1
mat[, j1] * mat[, j2]
``````

Actually, `j1` and `j2` created above are just the 1st and 2nd row of `combn(1:ncol(mat),2)`. So, if you still want to stay with `combn`, use

``````all.pairs <- combn(1:ncol(mat),2)
mat[, all.pairs[1,]] * mat[, all.pairs[2,]]
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download