【问题标题】:Fast way to get all pairs of matrix column element-wise products获取所有矩阵列元素乘积对的快速方法
【发布时间】:2016-10-19 19:02:06
【问题描述】:

假设我有一个数字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]]))

【问题讨论】:

    标签: r matrix product


    【解决方案1】:

    我们可以这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多