2011-12-10 20 views
4

は実係数の任意N X N行列を考えると、我々は、双一次形式Bを定義することができRN X RN→双線形&二次形式の評価をベクトル化する方法は?

BXY)= XTAyの

と二次形式QでRRN&#x2192。 RQ(X)= B(X、X)= XT

によってアックス

(二次形式の最も一般的な用途のためQ 、マトリックスは、対称、又は正定も対称である、そうであれば、これらのいずれかが事実であると仮定して自由に感じますそれはあなたの答えのために重要。)

(、FWIW、B IQ II)はN X N恒等行列であり、それぞれ、標準内積であり、R N、即ち上L ノルムの二乗XTYXT X。)

は今、2つのN X メートル行列、XY、及びがあるとnxnマトリックス。私は、Bの両方の計算を最適化したいX 、IY 、I)とQX 、I)(x、iおよびy 、i)は、それぞれXYI列目を示し、Iは、少なくともnumpyの、R、またはMatlabのようないくつかの環境では、これはベクトルのいくつかのフォームを含むであろう、と推測します。寸法MN X メートルMN X メートルと私が考えることができる唯一の解決策は、対角ブロック行列を生成する必要

[X]、[Y]及び[]、それぞれMN X MN、および(ブロック)対角要素X と、Iy 、およびAである。次いで、所望の計算は、行列乗算[X] T [A] [Y]および[X] T [] [X]であろう。この戦略は、まったく間違いありませんが、時間と空間の両面で効率的な方法があれば、私はそれを見ていきたいと思います。 (これらのブロック行列のまばらさを利用していないその実装は運命づけられないことは言うまでもない)

もっと良いアプローチがありますか?

これを行う私の好みはnumpyですが、RやMatlabのような効率的な行列計算をサポートする他のシステムの回答もOKです(私はそれらをnumpy)。

ありがとうございます!製品X T所望BX 、IYを計算するであろう AYX T AXを計算もちろん

、i)およびqX 、I)無関係Oメートル )と一緒に、(得メートル X メートル行列の対角要素として)B(X 、IY 、J)とB(X 、I、X 、J)、(I&#x2260のために、 j)、これは非スターターです。

答えて

4

ここにあなたが探しているものをあなたに与える必要numpyの中ソリューションです:

((np.matrix(X).T*np.matrix(A)).A * Y.T.A).sum(1) 

これはX T * Aのための行列乗算は、その後、乗算する要素ごとの配列の乗算を行いんY T。結果の配列の行は、1-D配列を生成するために合計されます。

+0

ありがとう:あなたはこれを試みることができます!あなたは(np.matrix(X).T * np.matrix(A))を意味しましたか?* ** np.matrix(Y)** .T.A).sum(1)? – kjo

+1

X、A、Yを行列として格納すると、((X.T * A).A * Y.T.A).sum(1)の方が短くなります。私は主に行列の乗算と要素ごとの乗算を明確にするためにnp.matrix呼び出しを含めていました。 –

+0

または配列を貼り付けるだけです:(np.dot(X.T、A)* Y.T).sum(1) – user333700

1

それはあなたが達成しようとしているものを完全には明らかではないが、Rで、あなたはクロス製品を形成するためにcrossprodを使用します。与えられた行列Xと互換性のある寸法のYcrossprod(X, Y)戻っX T Y.同様に、行列乗算は%*%演算子で行われます。X %*% Yは積XYを返します。したがって、X T AYをcrossprod(X, A %*% Y)として得ることができます。行列の乗算やループなどの仕組みを心配する必要はありません。

行列が、計算(対称、三角、疎、バンドなど)を最適化できる特定の構造を持っている場合、これをサポートするMatrixパッケージを見ることができます。

私はMatlabを使用していませんが、これらの操作には同様の機能があると確信しています。

-1

あなたはMATLABでそれをしたい場合は、それは本当に簡単です:

あなたはちょうど私がそれは努力の価値があるだろうかどうかを疑うが、あなたは物事をスピードアップしたい場合は

b = x'*A*y; 
q = x'*A*x; 

を入力することができます

M = x'*A; 
b = M*y; 
q = M*x; 
+1

あなたはこの質問に答えていません。 xとyが列ベクトルの行列、Fが正方行列の場合、正解は値のベクトルであり、結果は行列ではありません。私は正しいforumlaが 'sum((x '* F)。* y'、2)'だと思います。 –

+1

あるいはさらに簡単: '合計(X *(Fの* yを))' –

+1

peci1 @結果は、ベクトルではなく、行列でなければなりませんなぜ私は表示されません。次のようにすれば、マトリックスが結果であると信じることができます。それぞれ次元がmn xm、mn xm、mn x mnで、対角要素がxである[[X]、[Y] I、Y、I、およびA、それぞれ次に所望の計算は、行列乗算であろう[X] T [A] [Y]と[X] T [A] [X]」 –

関連する問題