Soru:
Matris yoğun ve yalnızca sıfırlarla dolu olduğunda bir matris-vektör çarpımını etkin şekilde uygulayan kod üretmek için prosedür veya teori var mı? İdeal olarak, optimize edilmiş kod, çoğaltılmış işi azaltmak için önceden hesaplanmış bilgilerin sistematik bir şekilde kullanılmasını sağlar.
Başka bir deyişle, bir matrisine sahibim ve daha sonra vektörünü aldığımda hesaplanmasını mümkün olduğu kadar verimli hale getirecek olan dayalı bir ön hesaplama yapmak istiyorum .
v , "derleme zamanında" bilinen, dikdörtgen, yoğun, ikili bir ikili matristir; , yalnızca "çalışma zamanında" bilinen, bilinmeyen bir gerçek vektördür.
Örnek 1: (sürgülü pencere)
Amacımı göstermek için kolay küçük bir örnek kullanmama izin verin. Matrisi göz önünde bulundurun, Diyelim ki bu matrisi vektörüne almak için vektörüne uyguladık . Ardından sonucun girişleri:
Standart bir matris-vektör çarpımı yapmak, tam olarak bu şekilde hesaplar. Ancak bu çalışmaların çoğu gereksizdir. "Koşu toplamı" sonraki sayıyı almak için toplama / çıkarma yaparak aynı matris hesaplamasını daha düşük maliyetle yapabiliriz:
Örnek 2: (hiyerarşik yapı)
Önceki örnekte, çalışan toplamı izleyebildik. Bununla birlikte, genellikle bir ara sonuç ağacı oluşturmak ve saklamak gerekir. Örneğin, düşünün Bir ara sonuç ağacı kullanılarak verimli bir şekilde hesaplanabilir :w=Mv
- Compute ve ve almak için onları eklemek .w 7 w 3
- Compute ve ve almak için onları eklemek .g 6 g 2
- Ekle ve olsun içing 3 g 1
Yukarıdaki örneklerde yer alan yapıyı görmek kolaydır, ancak ilgilendiğim gerçek matrisler için yapı o kadar basit değildir.
Örnek 3: (düşük seviye)
Bir karışıklığı gidermek için, matrisler genellikle seyrek değildir. Spesifik olarak, bu problemi çözen bir yöntemin, büyük blokların büyüklerle doldurulduğu matrisleri uygulamak için etkili yöntemler bulabilmesi gerekir. Örneğin, düşün
Bu matris iki sıra-1 matrisin farkı olarak ayrıştırılabilir,
bu nedenle vektöründeki eylemi , w 1
Motivasyon:
Bazı görüntü işleme için sayısal bir yöntem üzerinde çalışıyorum ve her zaman sabit olan farklı yapılara sahip birkaç büyük yoğun matris var. Daha sonra bu matrislerin , kullanıcının girişine bağlı olacak birçok bilinmeyen vektöre uygulanmaları gerekecektir. Şu anda matris bazında etkin kod bulmak için kalem ve kağıt kullanıyorum, ancak işlemin otomatikleştirilip gerçekleştirilemeyeceğini merak ediyorum.V i
Düzenleme: (postscript)
Buradaki cevapların hepsi (9/5 / 15'ten itibaren) ilginç, ancak hiçbiri soruyu umduğum kadar tatmin edici bir şekilde cevaplamıyor. Muhtemelen bunun zor bir araştırma sorusu olduğu ve hiç kimsenin iyi bir cevap bilmediği ortaya çıktı.
Zaman bittiğinden beri, doğru soruyu yanıtladığından EvilJS'in cevabına ödül veriyorum . Ancak cevabın daha net ve ayrıntılı açıklamalar içermesini diliyorum.
tranisstor'ın cevabı bu soru ile Çevrimiçi Boolean Matris-Vektör Çarpma (OMv) problemi arasında bir bağlantı kurar, ancak bağlantı tam olarak bu sorunun ne sorduğu değildir. Özellikle, aşağıdaki varsayım tam olarak uymuyor (cesur vurgulu madeni),
Şimdi varsayalım ki herkes için ve tüm matrisler , n x n E biz bir algoritma biliyoruz , hepsi vektörler için hesaplar süresi içinde gerçekten subquadratic sürede, yani bazı . v M v O ( n, 2 - ε ) ε > 0
Tüm matrisler için ikinci dereceden algoritmalar bulunup bulunmadığı, mümkün olduğu kadar hızlı olan belirli bir matris için bir algoritma bulma meselesine diktir. 0-1 matrislerin çoğu rastgele gürültüye benziyor ve (tahmin edersem) muhtemelen ikinci dereceden algoritmalara sahip değiller. Bununla birlikte, çok kötü matrislerin olması, örneğin "kayan bir pencere" matrisi gibi iyi bir matris üzerinde hızlı bir algoritma bulmamı engellemez.
vzn'nin cevapları, ilk yanıtı , ikinci yanıtı ilginçtir (ve bence çok fazla aşağı oyu hak etmiyor), ancak oradaki yorumlarda tartışılan nedenlerden dolayı soruya uygulanmıyorlar.