【问题标题】:How can I convert f(x,y) to a 2-D matrix (i.e. lookup table)?如何将 f(x,y) 转换为二维矩阵(即查找表)?
【发布时间】:2012-04-08 18:17:11
【问题描述】:

给定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=112*12=144 的乘法表。

或者假设我想要一个除第 3 行第 5 列中的一个外全为零的 6x6 矩阵。我可以写 @987654329,而不是直接写入该矩阵,或创建一个全零矩阵然后修改它@

【问题讨论】:

    标签: matlab function matrix octave lookup-tables


    【解决方案1】:

    我将使用MESHGRID 的组合为xyARRAYFUN 生成二维输入网格,以评估每个网格对的标量函数f。对于您的第一个示例,您可以这样做:

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

    请注意,我将输入和输出的顺序颠倒为 MESHGRID,以便x 的值沿生成的查找表的行向下增加。

    【讨论】:

    • 完美。这正是我想要的。没关系,在看到您的答案之前,我实际上已经弄清楚并使用了这种方法:)
    • @gnovice:x​​ 和 y 的反转是我通常使用ndgrid 而不是meshgrid 的原因
    • @Jonas:好点。在这种情况下,NDGRID 可能会让事情变得更清楚。我只是习惯于首先使用 MESHGRID 来创建任何网格。
    【解决方案2】:

    这样的?

    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)
    

    【讨论】:

    • 我一直在寻找一种本机/矢量化的方式来做到这一点,没有副作用,但也许没有这样的事情。
    • 我认为匿名函数是不可能的,至少我不知道其他方法。
    【解决方案3】:

    我已经做了一个函数,你可以使用它。

    它适用于任意数量的输入。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      相关资源
      最近更新 更多