2017-01-08 6 views
3

Matlab R2016aでは、小さなXベクトルとYベクトルがペアになっています(10,000個の1x3 Xベクトルと10,000個の1x3 Yベクトルがペアになっています) 。各{X、Y}のペアについて、XとYの要素のペアごとの組み合わせごとに2スカラー引数関数を計算したいと思います(私の例では10,000の3x3行列が得られます)。定数関数でbsxfunが動作しない

私はこれらの計算を実行するのにbsxfunを使うことができると思っていましたが、簡単なテストをしようとするとうまくいきません。 bsxfun(@(x,y) x*y,[1 2],[1 2]')リターン:

ans = 

    1  2 
    2  4 

私が期待するものです。しかし、bsxfun(@(x,y) 1,[1 2],[1 2]')リターン:

意味をなさない
Error using bsxfun 
Specified function handle produces invalid output dimensions. The function handle 
must be a binary elementwise function. 

。関数ハンドルであり、常にスカラー1を返すバイナリの要素関数なので、bsxfunの仕組みを理解していない限り、bsxfunones(2,2)と同じ結果を返さなければなりません。

+0

に依存します。私は通常、テストケースが、私が – Frank

答えて

5

bsxfunに渡される関数ハンドルへの入力は、スカラーではありません。 R2016bより前のバージョンでは、入力はスカラーまたは同じサイズです。

FUNCはまた、上記 に記載されていない任意のバイナリ要素単位関数へのハンドルとすることができます。 C = FUNC(A,B) の形式のバイナリ要素型関数は、任意の大きさの等しい配列ABを受け取り、は同じサイズの出力 を返します。出力配列Cの各要素は、ABの対応要素の操作の結果である です。 FUNCは もA又はBがスカラーである場合、Cは、他の入力アレイ内の各要素にスカラーを適用 結果となるようなスカラー拡張をサポートしなければなりません。 R2016b以降のリリースでは

、彼らは同じサイズである必要はありませんが、あなたが示されている例ではcompatible sizes

する必要があり、関数ハンドルへの最初の入力はスカラであり、第二は、ベクトル(y)と関数は、xのすべての要素に対して評価され、出力はあなたが投稿した場合y

の大きさであることが予想され、bsxfunへの呼び出しは、本質的に同等である:

x = [1 2]; 
y = [1 2].'; 

yourfunc = @(x,y)x * y; 

for k = 1:numel(x) 
    output(:,k) = yourfunc(x(k), y) 
end 

すべてのエントリに1を返す場合は、関数を適切なサイズの出力を生成するものに置き換える必要があります。あなたが関数ハンドルを策定方法

bsxfun(@(x,y)ones(max(size(x), size(y))), [1 2], [1 2]') 

は本当にあなたの特定の問題、私はそこまで私のコードでは、まだもらっていない

+0

を使用していない関数に依存するコードを書く次の時間を過ごす前に、ドキュメントを引用するのが好きです。 "C = fun(A、B)という形式のバイナリ要素型関数は、任意のサイズだが同じサイズの配列AとBを受け取り、**は同じサイズの出力を返します**。 –

+0

しかし、この例では、引数は同じサイズではありませんか? '[1 2]'は1x2ですが、[1 2]は2x1ですが、 '@(x、y)x * y'のために働きます。 – Frank

+0

また、それは単に 'bsxfun(@(x、y)ones(size(y))、[1 2]、[1 2] ')'ではないでしょうか? – Frank

関連する問題