2009-08-13 22 views
11

options for working with sparse matrices in R'u öğrendikten sonra, aşağıdaki veri çerçevesinden seyrek bir matris oluşturmak için Matrix paketini kullanmak istiyorum ve diğer tüm öğelerin NA olmasını sağlayın. Ben NA olmak varsayılan değere sahip istiyorsanızNA varsayılan girişleriyle bir Seyrek Matris Oluşturma (ve Erişim)

> library(Matrix) 
> Y <- sparseMatrix(s,r,x=d) 
> Y[1089,3772] 
[1] 1 
> Y[1,1] 
[1] 0 

ama, ben şu çalıştı:

 s r d 
1 1089 3772 1 
2 1109 190 1 
3 1109 2460 1 
4 1109 3071 2 
5 1109 3618 1 
6 1109 38 7 

her zamanki gibi unsurları erişen, ben aşağıdaki ile seyrek matris oluşturmak biliyorum

M <- Matrix(NA,max(s),max(r),sparse=TRUE) 
    for (i in 1:nrow(X)) 
    M[s[i],r[i]] <- d[i] 

ve bu hata var

Error in checkSlotAssignment(object, name, value) : 
    assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE 

Sadece bu değil, öğelere erişmek için daha uzun sürüyor.

> system.time(Y[3,3]) 
    user system elapsed 
    0.000 0.000 0.003 
> system.time(M[3,3]) 
    user system elapsed 
    0.660 0.032 0.995 

Bu matrisi nasıl oluşturmalıyım? Bir matris neden bu kadar yavaş çalışıyor?

X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772, 
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s", 
"r", "d"), row.names = c(NA, 6L), class = "data.frame") 

cevap

12

Evet, Thierry'nin cevabı ben 'Matrix' paketinin katkıda bulunan yazar olarak söyleyebiliriz kesinlikle doğrudur ...

? Ana yanıt, "M" nin "Y" den çok daha küçük ve platformun boyutuna ve büyüklüğüne bağlı olarak, erişim zamanının daha küçük nesneler için daha hızlı olması, özellikle de onlar.

+0

Teşekkürler! StackOverflow'ta daha fazla cevabınızı görmeyi dört gözle bekliyorum. Matrix'i kullanırken karşılaştığım bazı soruları denemeye çalışacağım ... –

+10

Sıfır olmayan tüm hücrelerin her zaman depolanmış olması talihsiz bir durum. Bir sparseMatrix için sıfırdan farklı bir varsayılan değer belirtmek güzel olurdu. – Quantum7

+1

SparseMatrix için varsayılan değer var mı diye düşünüyorum? – hs3180

15

Neden NA varsayılan değerlere istiyoruz:

İşte yukarıdaki veriler için kod snippet'ine? Bildiğim kadarıyla matrisler sadece sıfır hücreye sahiplerse seyrek olurlar. NA, sıfır olmayan bir değer olduğundan, seyrek matrisin tüm faydalarını kaybedersiniz. Matris neredeyse sıfırsa, klasik matris daha da verimlidir. Klasik bir matris, boyutlara göre kesilecek bir vektör gibidir. Yani sadece veri vektörünü ve boyutları saklamak zorunda. Seyrek matris sadece sıfır olmayan değerleri saklar, ancak aynı zamanda orada konum depolar. Bu, eğer sadece yeterli sıfır değeriniz varsa, bir avantajdır. Neden "Y" daha yavaş "M" erişen: Diğer soru için

+0

Evet, sanırım bu doğru. –

+1

Ama "varsayılan" değeri 1 ise, o zaman kesinlikle depolamak için 1 ekstra bit bilginiz var, yani varsayılan değer 0 kabul etmek yerine 1'dir. Hala "varsayılandan farklı" değerleri 0'da yaptığınız gibi saklıyorum Örnek ama öncül çok daha genel. – adunaic

+1

"Bu, ancak yeterli sıfır değeriniz varsa bir avantajdır.": Basitçe doğru değil. Yorumunuzdaki "sıfır" sırasındaki her yinelemeyi "bir" veya başka bir sayıyla değiştirin ve cümlenizin hala geçerli olduğunu göreceksiniz. Sıfırın kullanılması sadece sözleşmeyle yapılır ve sıfırdan farklı varsayılan değerlere sahip olmak anlamında birçok uygulama vardır. Bellek tasarrufu açısından, varsayılan değeri, veri kümenizde en sık ortaya çıkan sayıya ayarlamak mantıklıdır. – derwiwie