Pertanyaan:
Apakah ada prosedur atau teori yang mapan untuk menghasilkan kode yang secara efisien menerapkan perkalian matriks-vektor, ketika matriks padat dan diisi hanya dengan nol dan satu? Idealnya, kode yang dioptimalkan akan membuat penggunaan sistematis informasi yang dihitung sebelumnya untuk mengurangi duplikasi pekerjaan.
Dengan kata lain, saya memiliki matriks dan saya ingin melakukan beberapa perhitungan berdasarkan , yang akan membuat komputasi seefisien mungkin ketika saya nanti menerima vektor .
adalah matriks biner padat persegi panjang yang dikenal pada "waktu kompilasi", sedangkan adalah vektor nyata yang tidak diketahui yang hanya dikenal pada "run time".
Contoh 1: (jendela geser)
Biarkan saya menggunakan contoh kecil yang mudah untuk menggambarkan poin saya. Pertimbangkan matriksnya, Misalkan kita menerapkan matriks ini ke vektor untuk mendapatkan . Maka entri dari hasilnya adalah,
Melakukan perkalian matriks-vektor standar akan menghitung dengan cara ini. Namun, banyak dari pekerjaan ini yang mubazir. Kita bisa melakukan perhitungan matriks yang sama dengan biaya lebih murah dengan melacak "running total", dan menambahkan / mengurangi untuk mendapatkan nomor berikutnya:
Contoh 2: (struktur hierarkis)
Pada contoh sebelumnya, kita bisa melacak total yang berjalan. Namun, biasanya orang perlu membuat dan menyimpan pohon hasil menengah. Sebagai contoh, pertimbangkan
- Hitung dan , dan tambahkan mereka untuk mendapatkan .
- Hitung dan , dan tambahkan mereka untuk mendapatkan .
- Tambahkan dan untuk mendapatkanw 3 w 1
Struktur dalam contoh di atas mudah dilihat, tetapi untuk matriks yang sebenarnya saya tertarik, strukturnya tidak begitu sederhana.
Contoh 3: (peringkat rendah)
Untuk menjernihkan kebingungan, matriks pada umumnya tidak jarang. Secara khusus, metode yang memecahkan masalah ini harus dapat menemukan metode yang efisien untuk menerapkan matriks di mana blok besar diisi dengan yang. Sebagai contoh, pertimbangkan
Matriks ini dapat didekomposisi sebagai perbedaan dari dua matriks peringkat-1,
jadi aksinya pada vektor dapat dihitung secara efisien dengan, w 1
Motivasi:
Saya sedang mengerjakan metode numerik untuk beberapa pemrosesan gambar, dan ada beberapa matriks padat besar dengan struktur berbeda yang diperbaiki untuk semua waktu. Nanti matriks-matriks ini perlu diterapkan pada banyak vektor tidak dikenal yang akan bergantung pada input pengguna. Saat ini saya menggunakan pensil-dan-kertas untuk menghasilkan kode efisien berdasarkan per-matriks, tapi saya bertanya-tanya apakah prosesnya dapat otomatis.v i
Edit: (tambahan)
Semua jawaban di sini sejauh ini (per 9/5/15) menarik, tetapi tidak ada yang menjawab pertanyaan dengan memuaskan seperti yang saya harapkan. Mungkin ternyata ini adalah pertanyaan penelitian yang sulit, dan tidak ada yang tahu jawaban yang bagus.
Karena waktu telah habis, saya memberikan hadiah untuk jawaban EvilJS karena ini menjawab pertanyaan yang tepat. Namun, saya berharap jawabannya berisi penjelasan yang lebih jelas dan terperinci.
Jawaban tranisstor membuat hubungan antara pertanyaan ini dan masalah Online Boolean Matrix-Vector Multiplication (OMv), tetapi koneksi tidak persis apa yang ditanyakan pertanyaan ini. Secara khusus, asumsi berikut ini tidak benar-benar cocok (penekanan berani saya),
Sekarang asumsikan bahwa untuk semua dan semua matriks n × n M kita tahu algoritma , bahwa untuk semua vektor menghitung dalam waktu yang benar-benar subquadratic, yaitu dalam waktu untuk beberapa . v M v O ( n 2 - ε ) ε > 0
Apakah ada atau tidak algoritma subquadratic untuk semua matriks adalah ortogonal untuk pertanyaan menemukan suatu algoritma untuk matriks tertentu yang secepat mungkin. Sebagian besar matriks 0-1 terlihat seperti noise acak dan (jika saya menebak) mungkin tidak memiliki algoritma subquadratic. Namun, fakta bahwa ada matriks yang benar-benar buruk di luar sana tidak mencegah saya menemukan algoritma cepat pada matriks yang baik, misalnya, matriks "sliding window".
jawaban vzn ini, jawaban pertama , jawaban kedua yang menarik (dan menurut saya tidak layak begitu banyak downvotes), tetapi mereka tidak berlaku untuk pertanyaan karena alasan yang dibahas dalam ada komentar.
sumber
Jawaban:
Jika memungkinkan cobalah untuk mengeksploitasi sifat matriks tridiagonal berpita.
Kalau tidak, jika matriks hanya berisi sejumlah nilai berbeda (yang pasti biner), Anda harus mencoba algoritma Mailman (oleh Edo Liberty, Steven W. Zucker Dalam laporan teknis universitas Yale # 1402): dioptimalkan melalui kamus terbatas
Eliminasi Subekspresi Umum diketahui untuk beberapa waktu seperti Multiplikasi Konstan Berganda, tetapi turun ke level gerbang adalah pilihan - pola yang digunakan di sini dapat digunakan secara terpisah sebagai solusi atau digabung dengan metode lain, makalah untuk "Meningkatkan Eliminasi Sub-ekspresi Umum" ini Algoritma dengan Metode Komputasi Tingkat Gerbang Baru "oleh Ning Wu, Xiaoqiang Zhang, Yunfei Ye, dan Lidong Lan diterbitkan dalam" Prosiding Kongres Dunia Teknik dan Ilmu Komputer 2013 Vol II WCECS 2013, 23-25 Oktober 2013, San Francisco, AS " CSE tingkat gerbang
Ada juga metode kasar tetapi bekerja, untuk menghasilkan matriks simbolik dengan konstanta, vektor dengan variabel dan hubungkan ke Static Single Assingment (SSA) dari kompiler, yang mengotomatiskan proses penulisan matriks dengan tangan.
prototipe algoritma baru
Apa yang Anda lakukan dengan menjalankan jumlah: Memberikan 10 operasi , dan dengan ide awal saya untuk menggunakan Thomas itu setara. Untuk saat ini saya masih menulis dan menguji algoritma baru, juga runtime yang buruk , tetapi hasil tes pertama memberi saya jawaban mengejutkan:
Yang memberi 9 operasi , mendefinisikannya sebagai + atau - adalah 1, dan = adalah 0.
Ini menghasilkan 7 operasi , hasil algoritme saya memberikan: Yang memberi 6 operasi Untuk saat ini saya dapat mengatakan bahwa saya menggunakan jarak Hamming, & dan | operasi bitwise, menghitung penggunaan dan membuat sesuatu seperti Cocke-Younger-Kasami (CYK) - "algoritma penguraian untuk tata bahasa bebas konteks, dinamai menurut penemunya, John Cocke, Daniel Younger dan Tadao Kasami. Ia menggunakan penguraian bottom-up dan dinamis pemrograman. " - dari Wikipedia Ini adalah teknik yang sama yang saya gunakan untuk membangun blok variabel.
sumber
Ini terkait dengan pertanyaan penelitian terbuka, yang dikenal sebagai masalah "Online Boolean Matrix-Vector Multiplication (OMv)". Masalah ini berbunyi sebagai berikut (lihat [1]): Diberikan biner matriks dan vektor kolom biner , kita perlu menghitung sebelum tiba.M n v 1 , … , v n M v i v i + 1n×n M n v1,…,vn Mvi vi+1
Perhatikan bahwa masalah dari pertanyaannya adalah agak lebih umum: Hal ini memungkinkan untuk matriks dan vektor bernilai real. Perhatikan bahwa masalah dengan matriks dan vektor Boolean "lebih mudah", karena menyajikan kasus khusus.n × nm×n n×n
Jelasnya, algoritma naif untuk masalah Penggandaan Matriks-Vektor Boolean Online (yang hanya menggunakan perkalian vektor-vektor-standar) membutuhkan waktu . Ada dugaan (lihat misalnya [1]) bahwa ini tidak dapat dilakukan dengan lebih cepat daripada . (Secara lebih rinci, dugaan ini berbunyi sebagai berikut: Tidak ada algoritma yang benar-benar subkubis, yang memecahkan Masalah Penggandaan Boolean Matriks-Vektor Online, yaitu tidak ada algoritma dengan waktu berjalan untuk ).O(n3) O(n3) O(n3−ε) ε>0
Diketahui bahwa algoritma Williams memecahkan masalah ini dalam waktu . Lihat [2] untuk lebih jelasnya.O(n3/log2n)
Ini akan menjadi terobosan di bidang batas bawah bersyarat, jika seseorang dapat membuktikan atau membantah dugaan di atas.
[1] Menyatukan dan Memperkuat Kekerasan untuk Masalah Dinamis melalui Dugaan Penggandaan Matriks-Vektor Online. oleh Henzinger, Krinninger, Nanongkai dan Saranurak
[ http://eprints.cs.univie.ac.at/4351/1/OMv_conjecture.pdf ]
[2] Penggandaan matriks-vektor dalam waktu sub-kuadrat: (diperlukan beberapa preprocessing). oleh Williams
[ http://dl.acm.org/citation.cfm?id=1283383.1283490 ]
Memperbarui
Salah satu pertanyaan dalam komentar adalah sebagai berikut: Kita tahu pada waktu kompilasi. Tidak bisakah kita menyesuaikan algoritme agar sesuai dengan , sehingga masalah OMv (dugaan) tidak berlaku? Kita akan melihat bahwa ini bukan masalahnya, kecuali dugaan OMv gagal.M M
Gagasan buktinya sederhana: Asumsikan kita dapat memberikan algoritma cepat untuk semua matriks hingga ukuran tertentu (mis. Membedakan semua kasus yang mungkin). Setelah ukuran tertentu ini kami menggunakan membagi dan menaklukkan.
Berikut detailnya:n0∈N n≤n0 n×n M An,M v Mv O(n2−ε) ε>0 n0×n0
Perbaiki beberapa , yang (tanpa kehilangan sifat umum) adalah kekuatan 2 dan lebih besar dari 2. Sekarang asumsikan bahwa untuk semua dan semua matriks kita tahu suatu algoritma , yang untuk semua vektor menghitung dalam waktu yang benar-benar subquadratic, yaitu dalam waktu untuk beberapa . (Perhatikan bahwa ini memungkinkan algoritma individu untuk setiap matriks hingga ukuran .) n ≤ n 0 n ×
Sekarang kita akan menyelesaikan OMv dalam waktu yang benar-benar subkubik:M n×n n=2k k n>n0 M M1,M2,M3,M4 2k−1×2k−1 2k−1≤n0 A2k−1,Mi n0
Diberikan matriks biner ukuran , di mana untuk beberapa dan , kita menggunakan strategi membagi dan menaklukkan. Kami membagi menjadi empat dengan ukuran . Jika , maka kita menggunakan algoritma , jika tidak, kita akan muncul kembali. (Karena adalah angka tetap, kita dapat memilih algoritma yang benar dalam waktu yang konstan.)n × n n = 2 k k n > n 0 M M 1 , M 2 , M 3 , M
Perhatikan bahwa kita akan membutuhkan paling banyak langkah rekursi . Juga, untuk vektor , kami akan menghitung . Jadi, untuk memproses semua perkalian matriks-vektor, kita akan membutuhkan total waktu komputasi .n v 1 , … , v n n O ( n 3 - ε log n )O(logn) n v1,…,vn n O(n3−εlogn)
Sudah diketahui bahwa logaritma tumbuh lebih lambat dari pada polinomial manapun (khususnya lebih lambat dari semua root). Memperbaiki beberapa dengan , kita melihat bahwa perhitungan total kami berjalan dalam waktu yang benar-benar subkubik (khususnya, dalam waktu ). Dengan demikian, dugaan OMv akan salah. ˜ ε <εO(n3- ˜ ε )ε~>0 ε~<ε O(n3−ε~)
(Jika memiliki ukuran dan dan bukan kekuatan 2, maka batas-batas pada waktu berjalan masih berlaku, karena kita bisa saja meningkatkan dan ke kekuatan berikutnya 2.)m × n m n n mM m×n m n n m
Kesimpulan: Jika Anda dapat menggunakan perbedaan huruf pada matriks input untuk mendapatkan algoritma cepat, maka Anda dapat meningkatkan dugaan OMv.
sumber
ini pada dasarnya adalah penelitian tingkat CS, masalahnya dipelajari dalam setidaknya dua samaran, salah satu dari perkalian matriks jarang (contoh makalah yang baru saja dikutip), dan juga kasus khusus "matriks biner jarang" juga dipelajari. 2 nd kasus yang diketahui terkait dengan mengoptimalkan program garis lurus. program minimal mungkin juga seperti DAG dengan dua jenis "gerbang", penjumlahan dan perkalian, sehingga beberapa literatur minimisasi sirkuit dapat terhubung dengan ini, dan mungkin perangkat lunak "off the shelf" dapat disesuaikan untuk tujuan tersebut. di sini adalah ref tertentu pada 2 nd kasus dan juga pertanyaan yang sama pada cstheory dengan beberapa studi dasar empiris awal.
Merupakan Matriks Biner Jarang Sebagai Program Garis Lurus Untuk Penggandaan / Matriks Vektor Cepat , Araujo
Cepat jarang boolean rantai matriks produk / cstheory
sumber
tidak yakin apakah masalah ini telah dipelajari secara tepat tetapi penelitian ini terkait & tampaknya memimpin / memulai yang masuk akal. itu terlihat pada dekomposisi hypergraph untuk perkalian matriks jarang. matriks biner adalah kasus khusus dari pendekatan ini. pendekatan ini akan menemukan strategi yang lebih optimal daripada metode perkalian "lurus". optimasi lebih lanjut (dalam kerangka ini) dimungkinkan berdasarkan properti matriks biner.
sumber