2011-06-01 26 views
6

unsurları olarak iki matrisin sütunları alarak işlevini uygulayın dim(d) = J x D ve dim(r) = J x R ile matrisler d ve r düşünün. Eğlenin (a, b) aynı uzunluktaki iki vektörü alan ve bir sayı döndüren bir işlev olsun.
d ve r sütunlarını ilgili birimlerim olarak ele almak ve bunlara outer uygulamak istiyorum.dış ilgi

Aşağıdaki kod d ve r sütunlarda listelerini oluşturarak ve ardından hem outer ve sapply kullanarak gerçekleştirmektedir:

kodu ne istediğiniz ve nispeten verimlidir ama hantal ve belirsizdir
d.cols <- split(d, col(d)) 
r.cols <- split(r, col(r)) 
outer(d.cols, r.cols, 
     function(x,y) { 
      sapply(seq_along(x), 
       function(i) { 
        Fun(x[[i]], y[[i]]) })}) 

. Almaya çalıştığım şeyi başarmanın daha iyi bir yolu var mı?

+0

örnek giriş/çıkış sağlanan yardımcı olurdu. İyi bir örnek işlevi, "Sum <- function (a, b) a + b" gibi basit bir şey olurdu. –

+0

Burada bir başka soru: http://stackoverflow.com/questions/5233308/is-there-ar-function-that-applies-a-function-to-each-pair-of-columns/5233713#5233713 – Aaron

cevap

10

Oldukça yakınsınız.

Sonra
VecFun <- Vectorize(Fun) 

sadece yapabilirsiniz:

outer(d.cols, r.cols, VecFun) 

Ör this related question açıklandığı gibi, tek ihtiyacınız bir vektörleşen sürüme Fun() fonksiyonunu dönüştürmek için Vectorize() işlevdir aşağıdaki gibi

Fun <- function(a,b) sum(a+b) 

ve r,d matrisler tanımlanır tanımlarsanız:

J <- 5 
D <- 3 
R <- 4 

d <- matrix(1:(J*D), J, D) 
r <- matrix(1:(J*R), J, R) 

o zaman bu olsun:

> outer(d.cols, r.cols, VecFun) 

    1 2 3 4 
1 30 55 80 105 
2 55 80 105 130 
3 80 105 130 155 
+0

'Vectorize' örnekleri geliyor! –

+0

@Roman Vectorize hakkında burayı SO üzerinde öğrendim. –

+0

Teşekkürler, ayrıca bağlantı yararlı oldu. – kalu