2

我想得到两个矩阵的每个元素的组合总和。

例如,[ 2, 4, 6] 和 [3, 6, 9] 的组合为 [5, 7, 12, 8, 10, 15, 11, 13, 18]。

我只想得到这个结果

x<-rbind(c(2,4,9))
y<-rbind(c(3,6,9))
x+y[1]
     [,1] [,2] [,3]
[1,]    5   7    12
x+y[2]
     [,1] [,2] [,3]
[1,]    8   10   15
x+y[3]
     [,1] [,2] [,3]
[1,]   11   13   18

我有 30 个矩阵,因此元素将扩展到 3^30 = 2.05891132 × 10^14 个元素。

我相信它可能存在更好的方法来做到这一点。

4

4 回答 4

2

只是想我会使用outer. 复制@Arun,这里有一些基准:

x <- rnorm(1000)
y <- rnorm(1000)
REP <- function() { z1 <- rep(x, length(x)) + rep(y, each=length(y)) }
GRID <- function() { z2 <- rowSums(expand.grid(x,y)) }
OUTER <- function() { z3 <- c(outer(x,y,"+")) }
require(rbenchmark)
benchmark(REP(), GRID(), OUTER(), replications = 10, order = "elapsed")

     test replications elapsed relative user.self sys.self user.child sys.child
3 OUTER()           10    0.24    1.000      0.19     0.05         NA        NA
1   REP()           10    0.31    1.292      0.21     0.10         NA        NA
2  GRID()           10    2.10    8.750      1.57     0.44         NA        NA
于 2013-01-17T15:24:01.380 回答
1

正如@Arun 建议的那样,您的问题很难解释。但是,这就是你的意思吗?(我想你忘了在你的例子中包括 18 。)

> a <- c(2,4,9)
> b <- c(3,6,9)
> sort(rowSums(expand.grid(a,b)))
[1]  5  7  8 10 11 12 13 15 18
于 2013-01-17T07:44:01.083 回答
0

这是你想要的?它从每个矩阵中选择元素的所有组合并返回总和

> x <- c(2, 4, 9)
> y <- c(3, 6, 9)
> 
> a <- rep(x,length(y))
> b <- rep(y, each=length(x))
> 
> c <- a + b
> c <- c[order(c)]
> c
[1]  5  7  8 10 11 12 13 15 18
于 2013-01-17T07:46:05.890 回答
0

另一种选择是使用combn.

sapply(a,function(x)combn(c(x,b),2,FUN=sum)[1:length(a)])
     [,1] [,2] [,3]
[1,]    5    7   12
[2,]    8   10   15
[3,]   11   13   18
于 2013-01-17T08:50:30.353 回答