0

各要素に適用したい次の関数があります。

function result = f(a, b, bs)
    % Simplified code
    result = a
    for i=0:bs
        result = dosomething(result, b(i))
    end
end

% Use
arrayfun(@result, gpuArray(A), gpuArray(B), size(B));

b関数に渡す目的でスカラーであると考えるように MATLAB を「だます」方法はありますか?

4

3 に答える 3

1

それを行う唯一の方法は、bsxfun関数を使用することです。

C = bsxfun(f, A, B') % A is column vector

多かれ少なかれ同等です

C(i,j) = f(A(i,1), B(j,1))

その他の便利な機能はrepmatです。

次に、一連の行列とベクトルがJITされるため、実質的にO(MN)スペースペナルティはありません(によってチェックされますnvidia-smi)。

于 2012-10-31T14:17:28.073 に答える
1

残念ながら、現在これを行う方法は 2 つあります。まず、gpuArray の ARRAYFUN 実装では、入力がスカラーであるか、すべて同じサイズであることが常に要求されます。第 2 に、gpuArray ARRAYFUN 本体は現在、外部スコープからの変数を参照するインデックス作成または無名関数をサポートしていません。

于 2012-10-29T11:29:38.820 に答える
0

あなたが何をしたいのか完全にはわかりませんが、 への呼び出しごとに配列 B 全体を関数に渡したいと思われますresult。これを実現する最善の方法は、次のような無名関数を使用することです (テストされていないコード)。

arrayfun( @(a_in) result(a_in, gpuArray(B), size(B)), gpuArray(A) );

これがすべきことは、 の値に関係なく、完全な配列を使用して、 1 つの引数 ( )のみを取り、 (実際には関数ヘッダーで)呼び出す無名関数を作成することです。したがって、 の各反復では、の 1 つのスライスだけを使用して呼び出されますが、 の全体が使用されます。a_inresultfBa_inarrayfunresultAB

上記のコードをより構文的に明示的に記述する方法は次のとおりです。

my_anon_fun = @(a_in) result(a_in, gpuArray(B), size(B));
arrayfun( my_anon_fun , gpuArray(A) );

免責事項: コードはテストされておらず、コードを使用した経験がほとんどないgpuArrayため、これは当てはまらない場合があります。

于 2012-10-28T23:24:07.067 に答える