1

bsxfun などの関数があります: http://www.mathworks.com/help/techdoc/ref/bsxfun.htmlただし、要素ごとのモードで動作します。ベクトルごとのモード(およびスカラー出力)で機能する同様の関数が必要です。

例として、ここで bsxfun をそのように使用しようとします。内部関数として、ベクトルの内積を使用します (これは単なる例です)。

function f = foo(a,b), f=a'*b; printf("called\n");, end

上記のダミー関数fooは 2 つのベクトルを想定しており、結果はスカラーです。呼び出されるたびに、メッセージが表示されます。

bsxfun(@foo,[2;3],[1 5;4 3])

結果は次のとおりです。

called
called
ans =

   14   19
    0    0

したがって、2 つの呼び出し (良い) ですが、ベクトル (2 つのスカラーのペア) の代わりに行列を取得します。このような場合、行列は事前に bsxfun によって作成され、残りは常にゼロになるため、最初の行だけを取得するだけで十分です。

しかし、常にそうであるとは限りません.ゼロだけでなく、いくつかの実際の値を取得することもあります.また、いくつかの副作用が含まれているのではないかと心配しています.

質問

では、bsxfun に似ているが、ベクトルを取得し、それらのベクトルの各操作ごとにスカラーを期待する関数はありますか?

4

1 に答える 1

1

組み込み関数はないと思いますが、arrayfun や cellfun を使えば何とかできるかもしれません。通常、arrayfun も要素単位ですが、最初に大きな配列をセルに分割すると、次のように実行できます。

foo = @(a,b) b*a
y = [2;3];
X = [1 5; 4 3];
% split X into cell array of rows
% apply foo to each row
cellfun(@(x) foo(y,x), num2cell(X,2))
ans = 
    17
    17

それが速度の利点をもたらすかどうかはわかりませんが(明示的なループの方が速いと思います)、読みやすい場合もあります。

于 2012-05-07T17:27:39.733 に答える