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

6

假设我有一个数值型的矩阵

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]]))
1个回答

9
我们可以这样做:
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)

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

其实,上面创建的j1j2只是combn(1:ncol(mat),2)的第一行和第二行。因此,如果你仍然想使用combn,请使用以下代码:

all.pairs <- combn(1:ncol(mat),2)
mat[, all.pairs[1,]] * mat[, all.pairs[2,]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接