我想使以下代码向量化:(其中fun
是自定义函数)
m = zeros(R,C);
for r = 1:R
for c = 1:C
m(r,c) = fun(r,c);
end
end
任何帮助都将不胜感激。
答案 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
请注意,meshgrid
比arrayfun
和循环更快,但有可能填满你的记忆,以至于无法在{{{{{{{ 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);