0

我想让以下代码矢量化:(fun自定义函数在哪里)

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

任何帮助,将不胜感激。

4

4 回答 4

2

使用网格:

 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)
于 2012-10-30T08:14:27.217 回答
2

为了清楚起见,如果不接受向量(或矩阵)作为输入,则没有通用的“向量化”解决方案。fun

也就是说,我将添加到 nate 的答案中,并说如果fun不接受矩阵,您可以使用以下方法:

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

但是您应该注意,这不是一个矢量化解决方案,因为它在引擎盖下arrayfun有一个for-loop,所以虽然它可能更漂亮,但它可能更慢。

于 2012-10-30T10:01:45.200 回答
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

请注意,它meshgridarrayfunand 循环快得多,但有可能会填满你的内存,以至于不可能在xory范围内使用这种方法来获得更高的分辨率(不诉诸某种块处理方案)。

我将在这里说明这arrayfun通常是要避免的事情,因为它通常比循环对应物慢得多,部分原因是循环的 JIT 加速,部分原因是匿名函数涉及的开销(嵌套三重,在这个案子)。

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

于 2012-10-30T10:19:22.583 回答
0

几个 Matlab 函数可以使用矩阵作为输入,它们为您提供矩阵作为输出。但如果乐趣是定制的,那就更容易了!您实际上可以fun接受矩阵作为输入(这当然取决于您在做什么,有时您不能,但大多数时候您可以)并且它会起作用。大多数时候,接受矩阵或仅数字的区别在于替换*.*其他运算符也是如此)。尝试:

m=[]; %not necesary in this case
r=1:R;
c=1:C;
m=fun(r,c);
于 2012-10-30T08:14:17.007 回答