質問:
行列が密で、ゼロと1だけで満たされている場合、行列ベクトル乗算を効率的に適用するコードを生成するための手順または理論は確立されていますか?理想的には、最適化されたコードは、以前に計算された情報を体系的に使用して、重複する作業を減らします。
つまり、行列 あり、に基づいて事前計算を行い、後でベクトル受け取ったときにを可能な限り効率的に計算します。
は「コンパイル時」に知られている長方形の密なバイナリマトリックスであり、は「実行時」にのみ知られている未知の実数ベクトルです。
例1:(スライディングウィンドウ)
簡単な小さな例を使用して、私のポイントを説明します。、行列を考える この行列をベクトルに適用してを取得するとします。結果のエントリは、
標準の行列ベクトル乗算を行うと、この方法で正確に計算されます。ただし、この作業の多くは冗長です。「実行中の合計」を追跡し、次の数を取得するために加算/減算することにより、同じ行列計算をより低いコストで実行できます。
例2:(階層構造)
前の例では、実行中の合計を追跡できます。ただし、通常は中間結果のツリーを作成して保存する必要があります。たとえば、考え 中間結果のツリーを使用して効率的に 計算できます。w=Mv
- と計算し、それらを追加してを取得し。w 7 w 3
- と計算し、それらを追加してを取得し。w 6 w 2
- とを追加してを取得しw 1
上記の例の構造は見やすいですが、私が興味を持っている実際の行列については、構造はそれほど単純ではありません。
例3:(低ランク)
混乱を解消するために、行列は通常スパースではありません。具体的には、この問題を解決する方法は、大きなブロックがブロックで満たされているマトリックスを適用するための効率的な方法を見つけることができる必要があります。たとえば、考慮してください
この行列は、2つのランク1行列の差として分解できます
そのため、ベクトルに対するアクションは、 w 1
動機:
私はいくつかの画像処理のための数値的手法に取り組んでおり、常に固定されているさまざまな構造を持ついくつかの大きな密な行列があります。後でこれらの行列は、ユーザーの入力に依存する多くの未知のベクトル適用する必要があります。現在、私は鉛筆と紙を使用して、マトリックスごとに効率的なコードを作成していますが、プロセスを自動化できるかどうか疑問に思っています。v i
編集:(追記)
ここまでの回答はすべて(9/5/15現在)興味深いものですが、私が期待したほど満足に答えられるものはありません。おそらく、これは難しい研究質問であり、誰も良い答えを知らないことが判明します。
時間が経ちましたので、EvilJSが正しい質問に答えているので、私はEvilJSの答えに賞金を授与しています。しかし、答えにもっと明確で詳細な説明が含まれていればいいのにと思います。
tranisstorの答えは、この質問とオンラインブール行列-ベクトル乗算(OMv)問題との間に関係を作りますが、この質問が求めているものとはまったく関係がありません。特に、次の仮定は実際には当てはまりません(太字の強調)。
今と仮定すべてのため、すべて行列、N × N M 、我々は、アルゴリズムを知っているすべてのベクトルのためにあること、計算時間、すなわち、真のsubquadratic時間に一部の。 V MとVのO (N 2 - ε)ε > 0
すべての行列に準2次アルゴリズムが存在するかどうかは、可能な限り高速な特定の行列のアルゴリズムを見つけるという問題に直結します。ほとんどの0-1行列は、ランダムノイズのように見え、(もし推測するなら)おそらく2次アルゴリズムを持たないでしょう。ただし、実際に悪い行列が存在するという事実は、たとえば「スライディングウィンドウ」行列など、良い行列で高速アルゴリズムを見つけることを妨げません。
vznの回答、最初の回答、2番目の回答は興味深い(そして、私の意見ではそれほど多くのダウン票に値しない)が、それらはそこでのコメントで議論された理由のために質問に適用されない。