Fonksiyon değerlerinden verimli bir matris yaratın

What would experienced R developers consider the most efficient (yet still readable) way to construct a matrix with a given number of rows and columns from a given function, such that e.g. A_ij = someFun(i,j) with 1 <= i <= rows, 1 <= j <= cols?

Dokümanlarda bir şey bulamadığım için ortaya çıktım.

initMatrix <- function(rows, cols, fn) {
    A <- matrix(nrow=rows, ncol=cols)
    for (i in 1:rows)
        for (j in 1:cols)
            A[i,j] <- fn(i,j)
    return(A)
}

Bu bana aptalca ve yavaş görünüyor. Herhangi bir iyileştirme (özellikle tek linerler) hoş geldiniz! :)

6

3 cevap

dış (sıra (satır), sıra (cols), fn) (veya aşağıda önerildiği gibi dış (seq_len (satır), seq_len (cols), fn) aradığınızı düşünüyorum. ) : Ne kadar fark olduğunu görmek için bazı örneklere ihtiyaç duyar.

Okunabilirlik açısından çok şey kazanabilirsiniz (en azından ne olup bittiğini öğrenmek için ? Dış 'a bakmak zorunda kalmazsanız), ama aslında çok fazla zaman harcadığınızı düşünmüyorum. . fn 'iniz ile başlaması için vektörleştirilirse daha akıllı ve daha etkili bir şey mümkün olabilir: değil mi?

7
katma
Ya da seq yerine seq_len ile.
katma yazar Richie Cotton, kaynak
Buna çok hızlı cevap verdiğiniz için teşekkür ederiz! $ Fn $ 'nin vektörelleştirilmesi söz konusu olduğunda ... maalesef değil. Tahmin edebileceğiniz gibi, R'ye oldukça yeniyim (numpy/scipy, akçaağaç ve benzerleri için kullanıyorum), bu yüzden henüz fonksiyonları nasıl düzenleyeceğimi bulamadım.
katma yazar fotNelton, kaynak

dış 'a bakın:

> outer (LETTERS [1:3], letters [4:7], paste)
     [,1]  [,2]  [,3]  [,4] 
[1,] "A d" "A e" "A f" "A g"
[2,] "B d" "B e" "B f" "B g"
[3,] "C d" "C e" "C f" "C g"
6
katma

Herhangi bir işlev yazıyorsanız, 'dış' diyerek hatalar alabilirsiniz, bu nedenle önce Vectorize.

fn <- function(i,j){ ... }

A <- outer(1:rows, 1:cols, Vectorize(fn))

Vectorizing olmadan çalışmayacağı örnek:

fn <- function(i,j){
  return(prop.test(c(tables[i,1], tables[j,1]), c(sum(tables[i,]), sum(tables[j,])))$p.value)
  }
1
katma
Böyle bir işleve bir örnek verebilir misiniz?
katma yazar fotNelton, kaynak
Güncelleme için teşekkürler.
katma yazar fotNelton, kaynak
Bir vektöre çağrıldığında işe yaramayan herhangi bir fonksiyon, bu problemle karşılaştığım (editte eklenmiştir)
katma yazar Spine Feast, kaynak