2013-08-17 20 views
1

內我有兩個矩陣: X應用外,以列的矩陣

A B C 
2 3 4 
3 4 5 

和y

D E 
1 2 
3 2 

我怎樣才能減去列中的元素的組合?給我以下結果:

AD AE BD BE CD CE 
1 0 2 1 3 2 
0 1 1 2 2 3 

我已經嘗試過應用outer,但不能使它與矩陣一起工作。矢量化函數是一個解決方案嗎?我已經嘗試了下面的代碼,但它似乎並沒有工作。

vecfun= Vectorize(fun) 
fun=function(a,b)(a-b) 
outer(x,y, vecfun) 

在此先感謝您的任何建議。

+0

可能的重複[從R data.table中的每個其他列減去每列](http://stackoverflow.com/questions/16919998/subtract-every-column-from-each-other-column-in-數據表) – Metrics

+1

@Karl,Thomas的解決方案既快速又高效。我認爲你應該接受這個答案。 – Arun

+1

我同意這可能是同一過程的重複,但是,這篇文章有一個簡單得多的問題,它允許一個簡單的解釋,特別是對初學者更容易。我強烈推薦給在StackOverflow上發佈問題的人:簡化您的問題並使用小型示例矩陣,以便具有類似問題的人可以快速理解它。 – Karl

回答

3

這不使用outer,但得到你想要的結果:

> do.call(cbind,lapply(1:ncol(x),function(i) x[,i]-y)) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 0 2 1 3 2 
[2,] 0 1 1 2 2 3 
3

這裏有另一種沒有循環/ *申請家庭(假設你的矩陣是xy):

x[ , rep(seq_len(ncol(x)), each=ncol(y))] - y[, rep(seq_len(ncol(y)), ncol(x))] 

    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 0 2 1 3 2 
[2,] 0 1 1 2 2 3 

我不確定它會不會更快。但我認爲這是一個有趣的方法。在計算過程中,這也需要兩倍的結果矩陣的內存。