如何从R中多个向量的组合计算乘积?

时间:2018-08-14 20:28:12

标签: r vector combinations permutation multiplication

尽管我已经尽力了,但我仍然很难给出准确的标题。这是我的问题。

a = 1/(1:10)
b = 3/(1:10)
c = 1/(1:5)
d = 1/(1:11)

我想得到一个向量e,使得e包含根据从ab,{{1 }}和c

例如,假设有两个向量d{1, 2},我想得到一个像这样的向量{3, 4}

谢谢!

3 个答案:

答案 0 :(得分:8)

expand.grid solution可以,但是在数学中有一种优雅的 Kronecker产品

R具有函数kronecker,但一次需要两个向量,因此对于递归应用程序,我们需要Reduce

oo <- Reduce(kronecker, list(a, b, c, d))

或者,使用outerkronecker的主力):

rr <- Reduce(outer, list(a, b, c, d))

这更加用户友好,因为rr[i, j, u, v]为您提供了a[i] * b[j] * c[u] * d[v]


备注1

请注意,oorr中的元素顺序不同。因为对于两个向量ab

kronecker(a, b)  ## a[1] * b, a[2] * b ...
outer(a, b)      ## a * b[1], a * b[2] ...

因此,kronecker的以下使用产生的结果与rr相同。

zz <- Reduce(kronecker, list(d, c, b, a))
dim(zz) <- c(length(a), length(b), length(c), length(d))

备注2

通过将a[i] + b[j] + c[u] + d[v]中的默认操作"*"outer替换为kronecker,可以将该方法修改为执行"+"。例如:

Reduce(function (x, y) outer(x, y, "+"), list(a, b, c, d))

备注3

johannes's answer可以改进。 apply的逐行应用是性能杀手。我们可以执行以下操作以获得与rr一致的结果。

xx <- Reduce("*", expand.grid(a, b, c, d))
dim(xx) <- c(length(a), length(b), length(c), length(d))

答案 1 :(得分:4)

类似这样的东西

a <- c(1, 2)
b <- c(3, 4)

现在针对您指出的问题:

apply(expand.grid(a, b), 1, prod)

x <- list(
  a=c(1/(1:10)),
  b=c(3/(1:10)),
  c=c(1/(1:5)),
  d=c(1/(1:11))
)

apply(expand.grid(x), 1, prod)

答案 2 :(得分:2)

这是一个针对两个列表执行此操作的功能。它不是效率最高的,但是可以完成工作。

my_function <- function(x, y) {
  result <- c()
  for(i in x) {
    for(j in y) {
      result <- c(result, i * j)
    }
  }
  return(result)
}

x = c(1, 2)
y = c(3, 4)

my_function(x, y)
# [1] 3 4 6 8