4

给定,对于特定范围和域内的任何一个f = @(x,y) [something with a scalar result],我可以计算一个查找矩阵的最佳方法是A什么?A(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的组合来为和生成二维输入网格,x使用 ARRAYFUN来评估每个网格对的标量函数。对于您的第一个示例,您可以这样做:yf

[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 回答