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

如何计算R中多个向量组合的乘积?,r,vector,combinations,permutation,multiplication,R,Vector,Combinations,Permutation,Multiplication,我觉得很难给出一个准确的标题,尽管我已经尽力了。这是我的问题 a = 1/(1:10) b = 3/(1:10) c = 1/(1:5) d = 1/(1:11) 我想得到一个向量e,这样e由从a、b、c和d中选择的值的组合计算而成 例如,假设有两个向量{1,2}和{3,4},我想得到这样的向量{1*3,1*4,2*3,2*4}={3,4,6,8} 提前谢谢 像这样的 a <- c(1, 2) b <- c(3, 4) a这里有一个函数可以为两个列表执行此操作。这不是最有效的方法

我觉得很难给出一个准确的标题,尽管我已经尽力了。这是我的问题

a = 1/(1:10)
b = 3/(1:10)
c = 1/(1:5)
d = 1/(1:11)
我想得到一个向量
e
,这样
e
由从
a
b
c
d
中选择的值的组合计算而成

例如,假设有两个向量
{1,2}
{3,4}
,我想得到这样的向量
{1*3,1*4,2*3,2*4}={3,4,6,8}

提前谢谢

像这样的

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

a这里有一个函数可以为两个列表执行此操作。这不是最有效的方法,但却能完成任务

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
my_函数可以,但在数学中有一个优雅的Kronecker乘积

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

oo <- Reduce(kronecker, list(a, b, c, d))
这更方便用户,因为
rr[i,j,u,v]
提供
a[i]*b[j]*c[u]*d[v]


备注1

请注意,
oo
rr
中的元素顺序不同。因为对于两个向量
a
b

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))
xx <- Reduce("*", expand.grid(a, b, c, d))
dim(xx) <- c(length(a), length(b), length(c), length(d))

备注3

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

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