我想让以下代码矢量化:(fun
自定义函数在哪里)
m = zeros(R,C);
for r = 1:R
for c = 1:C
m(r,c) = fun(r,c);
end
end
任何帮助,将不胜感激。
使用网格:
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)
为了清楚起见,如果不接受向量(或矩阵)作为输入,则没有通用的“向量化”解决方案。fun
也就是说,我将添加到 nate 的答案中,并说如果fun
不接受矩阵,您可以使用以下方法:
[Y, X] = meshgrid(1:R, 1:C);
m = arrayfun(@(r, c)fun(r, c), X, Y)
但是您应该注意,这不是一个矢量化解决方案,因为它在引擎盖下arrayfun
有一个for
-loop,所以虽然它可能更漂亮,但它可能更慢。
有几种方法可以做到这一点:
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
请注意,它meshgrid
比arrayfun
and 循环快得多,但有可能会填满你的内存,以至于不可能在x
ory
范围内使用这种方法来获得更高的分辨率(不诉诸某种块处理方案)。
我将在这里说明这arrayfun
通常是要避免的事情,因为它通常比循环对应物慢得多,部分原因是循环的 JIT 加速,部分原因是匿名函数涉及的开销(嵌套三重,在这个案子)。
因此,对于dblquad
您在评论中提到的示例:仅使用循环是最简单和最快的。
几个 Matlab 函数可以使用矩阵作为输入,它们为您提供矩阵作为输出。但如果乐趣是定制的,那就更容易了!您实际上可以fun
接受矩阵作为输入(这当然取决于您在做什么,有时您不能,但大多数时候您可以)并且它会起作用。大多数时候,接受矩阵或仅数字的区别在于替换*
(.*
其他运算符也是如此)。尝试:
m=[]; %not necesary in this case
r=1:R;
c=1:C;
m=fun(r,c);