2012-04-08 13 views
4

与えられたf = @(x,y) [something with a scalar result]は、特定の範囲とドメイン内のx,yA(x,y) == f(x,y)のような検索行列Aを計算する最良の方法は何ですか?f(x、y)を2次元行列(ルックアップテーブル)に変換するにはどうすればよいですか?

lookupTable(f,range,domain)という関数が私の望むことをしたとしましょう。次に、lookupTable(@(x,y) x * y, 12, 12)は、1*1=1から12*12=144までの乗算表を含む行列を生成する。

または、行3、列5にあるものを除いて、すべて0の6x6行列が必要な場合を考えてみましょう。文字通りその行列を書いたり、すべてゼロ行列を作成して修正したりする代わりに、lookupTable(@(x,y) x==3&&y==5, 6, 6)

答えて

4

Iは各格子対でスカラー関数fを評価するxyARRAYFUNための2-D入力グリッドを生成するために、MESHGRIDの組み合わせを使用します。私はxの値は結果のルックアップテーブルの行を下る増加ように関数meshgridする入力と出力の順序を逆に

[y, x] = meshgrid(1:12, 1:12); %# Or just [y, x] = meshgrid(1:12); 
lutable = arrayfun(f, x, y); 

注:あなたの最初の例では、あなたがこれを行うことができます。

+0

が完璧です。これはまさに私が探していたものです。私は実際にこれを見つけ出し、あなたの答えを見る前にこのアプローチを使用していたことを心配しないでください:) – traffichazard

+1

@gnovice:x​​とyの逆転はなぜ私が通常は 'meshgrid'ではなく' ndgrid'を使用するのかです。 – Jonas

+0

@この場合、NDGRIDはおそらく事をより明確にします。私はちょうどグリッド作成のために最初にMESHGRIDに向ける習慣を持っています。 – gnovice

3

何かこれは何ですか?

lookupTable(@(x,y) x==3&&y==5, 6, 6) 
+0

私は割り当てを副作用せずにこれを行うネイティブ/ベクター化された方法を探していましたが、そのようなことはないかもしれません。 – traffichazard

+0

私は匿名の関数では可能ではないと思っています。リースでは他の方法はわかりません。 – Griffin

1

と呼ば

function a = lookupTable(func, cols, rows) 
    a = zeros(cols, rows); 
    for i = 1:cols 
     for j=1:rows 
      a(i,j) = func(i, j); 
     end 
    end 
end 

私はあなたがそれを使用することができ、それを行うための機能を加えました。

これは任意の入力数で機能します。

function varargout = ndfun(fun, varargin) 
%%% [A B]=ndfun(@foo,X,Y) 
%%% ---> [A(i,j) B(i,j)]=foo(X(i),Y(j)) 
% Example: 
% ndfun(@times,[1 2 3],[ 6 7 8 9]) 
% ans = 
%  6  7  8  9 
%  12 14 16 18 
%  18 21 24 27 
%%% par Oli 03/2012 

args=cell(1,nargin-1); 
[args{:}]=ndgrid(varargin{:}); 

varargout=cell(1,max(1,nargout)); 

[varargout{:}]=arrayfun(fun,args{:}); 

end 
関連する問題