4

を考えると、特定の範囲とドメイン内のすべてのルックアップ行列をf = @(x,y) [something with a scalar result]計算できる最良の方法は何ですか?AA(x,y) == f(x,y)x,y

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

または、行 3、列 5 の 1 を除いてすべてゼロの 6x6 マトリックスが必要だとしましょう。文字通りそのマトリックスに書き込むか、すべてゼロのマトリックスを作成してから変更する代わりに、次のように記述できます。lookupTable(@(x,y) x==3&&y==5, 6, 6)

4

3 に答える 3

4

MESHGRIDを組み合わせて と の2 次元入力グリッドを生成しxyARRAYFUNf使用して各グリッド ペアでスカラー関数を評価します。最初の例では、これを行うことができます:

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

MESHGRID への入力と出力の順序を逆にしてx、結果のルックアップ テーブルの行に沿って値が増加していることに注意してください。

于 2012-04-08T20:50:13.880 に答える
3

このようなもの?

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

と呼ばれる

lookupTable(@(x,y) x==3&&y==5, 6, 6)
于 2012-04-08T18:22:52.840 に答える
1

それを行う関数を作成しました。使用できます。

任意の数の入力に対して機能します。

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
于 2012-04-08T20:35:31.443 に答える