2011-06-06 22 views
8

Seyrek matris biçimi (dok), sözlükte olmayan anahtarların değerlerinin sıfıra eşit olduğunu varsayar. Sıfırdan başka bir varsayılan değer kullanmasını sağlamak için herhangi bir yolu var mı? Eğer gerçekten bu gerekiyorsa Ayrıcascipy.sparse default value

, (düzenli numpy matrisinde np.log benzer) seyrek matris günlüğü hesaplamak için bir yol yoktur

cevap

8

O özellik yerleşik değildir, ancak, sen olmalı Kendi dok_matrix sınıfınızı veya Scipy'nin alt sınıfını yazabilir. Scipy uygulaması burada: https://github.com/scipy/scipy/blob/master/scipy/sparse/dok.py En azından dict.* çağrılarının yapıldığı yerlerde, varsayılan değerin değiştirilmesi gerekiyor --- ve belki de yapılması gereken başka değişiklikler var. Ancak, bu gerekli olmayan şekilde yeniden formüle etmeye çalışırdım. Örneğin sen lineer cebir yaparsanız, sabit terim yalıtmak ve en lineer cebir rutinleri (örneğin yinelemeli çözücüler) için yerine

from scipy.sparse.linalg import LinearOperator 
A = whatever_dok_matrix_minus_constant_term 
def my_matvec(x): 
    return A*x + constant_term * x.sum() 
op = LinearOperator(A.shape, matvec=my_matvec) 

yapabilirsin op yerine A geçirebilirsiniz.

Matris logaritmasıyla ilgili olarak: bir seyrek matrisin logaritması (scipy.linalg.logm'daki gibi) genellikle yoğundur, bu nedenle matrisi önce yoğun olanı dönüştürmeniz ve daha sonra her zamanki gibi logaritmayı hesaplamanız gerekir. Gördüğüm kadarıyla, seyrek bir matris kullanmak performans artışı sağlamazdı. Bir vektörün sadece logaritması ve log(A) * v vektörünü hesaplamak için ihtiyacınız varsa, bazı Krylov metodu yardımcı olabilir. Eğer otoh logaritma elementwise hesaplamak istiyorsanız

, siz yukarıdaki Bu yalnız sıfır elemanları bırakır

x = A.tocoo() 
x.data = np.log(x.data) 
A = x.todok() 

(en azından COO, CSR ve CSC mevcut) doğrudan .data niteliğini değiştirmek, ancak Bu, sabit parçayı ayrı ayrı işlemeye izin verir.

+1

Teşekkürler! Bu basit fonksiyonların henüz doğrudan uygulanmadığı bir talihsizliktir :( – ElKamina

+0

Bunun, seyrek matrisler için basit bir işlevsellikten ziyade oldukça özel olacağını söyleyebilirim :) Bu tür şeylerin diğer seyreklerde uygulanıp uygulanmadığını bilmiyorum Matrix paketleri, ama AFAIK Matlab'ın böyle şeyleri yok gibi görünüyor. Sorun, "eksik" değerinin sıfır olmaması durumunda, seyrek matrislerle yapabileceğiniz birçok işlemin (örneğin, faktörizasyon vb.) Iyi çalışmadığıdır. –

+0

@pv Evet. Varsayılan değer konusunda size katılıyorum. Ancak matrisin logunu hesaplamak gibi başka şeyler de uygulanmalıydı. Bir trivia biraz. X + 1 çalışmalarının belirli türdeki seyrek matrisleri için, ancak 1 + X, fark edilmeyen istisnayı artırır: D – ElKamina

İlgili konular