2016-10-29 8 views
1

の賢明なアプリケーションI引数として(1,3)ベクトル行 - インライン関数

a = [3;0.5;1]; 
b = 3 ; 
f = @(x) x*a+b ; 

を取るインライン関数fを定義したが、私はサイズ(N,3)のマトリックスXを有していると仮定する。 IはXの各列にfを適用する場合、私は単純に書くことができる:

f(X) 

をIは、(X)はFを検証(N、1)f(X)(i) = f(X(i,:))そのようなベクターです。

今、次の用語追加した場合:私はMATLABは入力として全体行列Xを検討して推測

Error using + 
Matrix dimensions must agree. 

Error in @(x) x*A*x' + x*a + b 

f = @(x) x*A*x' + x*a + b ; 

コマンドF(X)はエラーが発生します〜f。したがって、各行iがf(X(i、:))に等しいベクトルを作成しません。どうしたらいいですか?

私は私を助けることができる組み込み関数rowfunが存在することが分かったが、唯一のバージョンで利用可能であるように思わ正しい、と期待されているr2016(私はバージョンr2015aを持っている)

+0

'bsxfun'を試しましたか? – brainkz

+0

私はドキュメントから理解したところから、bsxfuncはAのXの各要素(各行ではない)の二次形式を計算します – dada

答えて

1

MATLABは、数学的な表記に近くに滞在しようとすると、あなたは(X*A*X'A 3×3とX N×3のために)何をしているか、有効な数学ではなく、非常にあなたがするつもり何を - あなたは終わるだろうN×Nの行列で、N×1の行列x*aには追加できません。

回避策は簡単ですが、醜い:

f_vect = @(x) sum((x*A).*x, 2) + x*a + b; 

今、あなたのNは、あなたが時間のこの十億毎日の毎分をしなければならない、膨大であるとしない限り、これの性能は多くあります容認できるよりも。私はファイル交換にMMX見てみることをお勧めしたいよりも

IFFは、しかし、これは本当に、本当に、あなたのプログラムのボトルネックとなっています。 permute()と一緒にすれば、これらの高速BLAS/MKL演算を使用してこの計算を行うことができ、それをノッチアップすることができます。

bsxfunは、mtimes()(行列乗算)をサポートしていないため、ここでは機能しません。

また、mtimes()の暗黙的なディメンション拡張が組み込まれているMATLAB R2016bにアップグレードすることもできますが、確認はしてください。

関連する問題