2012-03-21 15 views
3

における二つの行列の列のすべてのペアに関数を適用、私は行列ABに列ベクトルのすべてのペアに関数を適用したいと思います。私は効率的な(非for)これを行う方法がなければならないことを知っているが、私はそれを把握することはできません。この関数はスカラーを出力します。は、MATLABでMATLAB

答えて

7

na = size(A,1); 
nb = size(B,1); 
newvector = bsxfun(@(j,k)(func(A(j,:),B(k,:))),1:na,(1:nb)'); 

bsxfun 1にシングルトン拡張を実行してみてください:NAおよび(1:NB)」。この場合の最終結果は、AとBから描画された列ベクトルのすべてのペアにfuncが適用されることです。

bsxfunは扱いにくい可能性があることに注意してください。この場合、あなたが望む仕事をするために働くでしょう。

+0

私のfuncはドットプロダクトですが、ドットの引数が同じでなければならないというエラーが出ましたサイズ...何か問題が起こっている? – Bob

+0

@Bob列で呼び出すのではなく、行で呼び出す必要があります: 'bsxfun(@(j、k)func(A(:、j)、A(:k))、1:na、 :nb) ') '作品ですか? – Shai

1

ペアワイズを意味しますか?したがって、for-loopでは、関数はscalar_val = func(A(i),B(i))として機能しますか?

newvector = arrayfun(@(x) func(A(x),B(x)), 1:numel(A)); 

UPDATE

あなたはscalar_val = func(A(i), B(j))としてAとBのすべての組み合わせを実行する必要があなたのコメントよるABが同じサイズを持っている場合

あなたはARRAYFUN関数を適用することができます。これはもう少し複雑で、大きなベクトルはメモリをすばやく埋めることができます。

あなたの関数は、標準の一つである場合は、BSXFUNを使用して試すことができます:

out = bsxfun(@plus, A, B'); 

もう一つの方法は、MESHGRIDとARRAYFUNを使用することです:

[Am, Bm] = meshgrid(A,B); 
out = arrayfun(@(x) func(Am(x),Bm(x)), 1:numel(Am)); 
out = reshape(out, numel(A), numel(B)); 

「私はそれが動作するはずと信じていますが、私はドン今すぐテストする時間があります。

+0

これは 'scalar_val = func(A(i)、B(j))'であるべきです。 – srubin