获取所有矩阵列逐元素乘积对的快速方法

2024-05-14

假设我有一个数字matrix:

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

我想生成所有向量,它们是中所有唯一向量对的逐元素乘积的结果mat.

我们如何改进下面的代码:

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]]))

我们可以这样做:

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

或者,这是一种更快的方法:

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

请注意,上面将包括列与其自身的乘法。如果您想禁止这样做,请使用

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]

实际上,j1 and j2上面创建的只是第一行和第二行combn(1:ncol(mat),2)。所以,如果你还想留下来combn, use

all.pairs <- combn(1:ncol(mat),2)
mat[, all.pairs[1,]] * mat[, all.pairs[2,]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取所有矩阵列逐元素乘积对的快速方法 的相关文章

随机推荐