是否有内置函数来创建矩阵m,使得m(r,c)= fun(r,c)

时间:2012-10-30 07:45:48

标签: matlab matrix

我想使以下代码向量化:(其中fun是自定义函数)

m = zeros(R,C);
for r = 1:R
    for c = 1:C
        m(r,c) = fun(r,c);
    end
end

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:2)

使用meshgrid:

 N = 100 % grid points
 rangex=linspace(-2,2,N);
 rangey=linspace(-2,2,N);
 [x,y] = meshgrid(rangex,rangey);

 %G=fun(x,y);
 G= exp(-(x.^2+y.^2));
 imagesc(G)

答案 1 :(得分:2)

只是要说清楚,如果fun不接受输入的向量(或矩阵),则没有通用的“向量化”解决方案

那就是说,我会添加到nate的答案,并说如果fun不接受矩阵,你可以通过以下方式解决这个问题:

[Y, X] = meshgrid(1:R, 1:C);
m = arrayfun(@(r, c)fun(r, c), X, Y)

但是你应该注意到这不是一个矢量化解决方案,因为arrayfun有一个for循环,所以虽然它可能更漂亮但它可能更慢。

答案 2 :(得分:1)

有几种方法可以做到这一点:

G = @(x,y) exp(-(x.*x+y.*y));

% using meshgrid 
% PROS: short, very fast, works only on functions that accept vector/matrix input
% CONST: very large memory footprint
[x,y] = meshgrid(-10:0.1:10);   
m = G(x,y);


% using arrayfun
% PROS: shorter notation than loop, works on functions taking only scalars
% CONS: can be prohibitively slow, especially when nested like this
m = cell2mat(...
    arrayfun(@(x)...
    arrayfun(@(y) G(x,y), -10:0.1:10),...
    -10:0.1:10, 'uniformoutput', false));

% using for-loop
% PROS: intuitive to most programmers, works on functions taking scalars only
% CONS: Boilerplate can grow large, can be slow when the function G(x,y)
%       is not "inlined" due to limitations in JIT
for ii = 1:R
    for jj = 1:C

        m(ii,jj) = exp(-(ii*ii+jj*jj)); % inlined

        m(ii,jj) = G(ii,jj); % NOT inlined (slower)

    end
end

请注意,meshgridarrayfun和循环更快,但有可能填满你的记忆,以至于无法在{{{{{{{ 1}}或x范围(不采用某种块处理方案)。

我将在此声明y通常是要避免的事情,因为它通常比循环对应的慢得多,部分原因是循环的JIT加速,部分原因是由于涉及的开销匿名函数(在这种情况下嵌套三次)。

因此,对于您在评论中提到的arrayfun示例:只使用循环是最简单,最快速的。

答案 3 :(得分:0)

几个Matlab函数可以使用矩阵作为输入,它们为矩阵提供输出。但如果定制的乐趣甚至更容易!你实际上可以让fun接受矩阵作为输入(这取决于你当然在做什么,有时你不能,但大多数时候你可以)并且它会起作用。大多数情况下,接受矩阵或仅仅是数字的差异在于*替换.*(和其他运算符相同)。尝试:

m=[]; %not necesary in this case
r=1:R;
c=1:C;
m=fun(r,c);