2013-01-17 32 views
2

我想獲得兩個矩陣的每個元素的組合的總和。如何獲得兩個矩陣中的每個元素的總和R

例如,[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的元件。

我相信它可能存在一個更好的方法來做到這一點。

+0

謝謝你的建議!我不是英語原住民。 – Yoko

回答

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 
+0

不,不是必要的,但順序取決於電網擴展;因此:'rowSums(expand.grid(a,b))'''給出'[1] 5 7 12 8 10 15 11 13 18' –

+0

真的,但我希望它是;-) –

+0

謝謝安迪! 'rowSums(expand.grid(a,b))'是許多矩陣的最佳方法。我通過外部產品從每個矩陣中得到一個元素的所有組合產品,並將產品的結果和結果的結果合併到一個表中。所以元素的順序對我來說很重要。 – Yoko

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 
+0

我不能upvote呢..但我喜歡安迪巴伯的expand.grid方法。確實。 –

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 
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 
+0

@阿倫,你說得對。我需要用'c'來包裝,我會修復缺失的'')' – rrs

+0

感謝您提供更快的解決方案,但我認爲'outer'函數只適用於兩個參數。 – Yoko

相關問題