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

Matlab 是否有一个内置函数来创建矩阵m,使得m(r,c)=fun(r,c),matlab,matrix,Matlab,Matrix,我想将以下代码矢量化:(其中fun是一个自定义函数) 任何帮助都将不胜感激。几个Matlab函数可以使用矩阵作为输入,并将矩阵作为输出。但是,如果乐趣是习惯更容易!实际上,你可以让接受矩阵作为输入变得有趣(当然,这取决于你在做什么,有时你做不到,但大多数时候你可以),而且它会起作用。大多数情况下,接受矩阵或仅接受数字的区别在于用*替换*(其他运算符也是如此)。尝试: 有几个Matlab函数可以将矩阵作为输入,并将矩阵作为输出。但是,如果乐趣是习惯更容易!实际上,你可以让接受矩阵作为输入变得有趣(

我想将以下代码矢量化:(其中
fun
是一个自定义函数)


任何帮助都将不胜感激。

几个Matlab函数可以使用矩阵作为输入,并将矩阵作为输出。但是,如果乐趣是习惯更容易!实际上,你可以让接受矩阵作为输入变得有趣(当然,这取决于你在做什么,有时你做不到,但大多数时候你可以),而且它会起作用。大多数情况下,接受矩阵或仅接受数字的区别在于用
*
替换
*
(其他运算符也是如此)。尝试:


有几个Matlab函数可以将矩阵作为输入,并将矩阵作为输出。但是,如果乐趣是习惯更容易!实际上,你可以让接受矩阵作为输入变得有趣(当然,这取决于你在做什么,有时你做不到,但大多数时候你可以),而且它会起作用。大多数情况下,接受矩阵或仅接受数字的区别在于用
*
替换
*
(其他运算符也是如此)。尝试:

使用网格网格:

 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)
使用网格网格:

 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
-循环,因此,虽然它可能更漂亮,但它可能会更慢。

只是为了说明一点,如果
fun
不接受向量(或矩阵)作为输入,则没有通用的“矢量化”解决方案

也就是说,我将补充nate的答案,并说如果
fun
不接受矩阵,您可以使用:

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

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

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

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
和循环快得多,但可能会占用大量内存,因此无法在
x
y
范围内使用此方法获得更高的分辨率(无需诉诸某种块处理方案)

我将在这里指出,
arrayfun
通常是一件需要避免的事情,因为它通常比对应的循环慢得多,部分原因是循环的JIT加速,部分原因是匿名函数所涉及的开销(在本例中是嵌套的三元组)


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

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

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
和循环快得多,但可能会占用大量内存,因此无法在
x
y
范围内使用此方法获得更高的分辨率(无需诉诸某种块处理方案)

我将在这里指出,
arrayfun
通常是一件需要避免的事情,因为它通常比对应的循环慢得多,部分原因是循环的JIT加速,部分原因是匿名函数所涉及的开销(在本例中是嵌套的三元组)


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

但是如果自定义函数不能接受矩阵作为输入?例如:fun=@(a,b)dblquad(@(x,y)x.*y,0,a,0,b)实际上不知道。我会照你现在做的那样做。检查@nate的答案,可能有用!但是如果自定义函数不能接受矩阵作为输入?例如:fun=@(a,b)dblquad(@(x,y)x.*y,0,a,0,b)实际上不知道。我会照你现在做的那样做。检查@nate的答案,可能有用+1:如果
fun
可以接受矩阵作为输入,那么这个解决方案是有效的,但是如果不能,那怎么办?如果我错了,请纠正我,但是当你有任何f(x,y)=。。。这意味着它一定是一个矩阵,因为(x,y)是该矩阵的x-y坐标……你和我谈论的是不同的事情。根据定义
fun(x,y)
根据某个函数或矩阵将值映射到每个(x,y)对。换句话说,在计算单个对(2,3)的
fun
时,您将使用标量
x=2
和标量
y=3
馈送
fun
,如下所示:
fun(2,3)
。现在,如果要计算几对的
fun
,该怎么办?
fun
的实现能否为
x
y
使用向量,例如
fun([2 10],[3 27])
?我认为
fun
不一定能处理这样的输入。+1:如果
fun
可以接受矩阵作为输入,那么这个解决方案是有效的,但是如果不能呢?如果我错了,请纠正我,但是当你有任何f(x,y)=。。。这意味着它一定是一个矩阵,因为(x,y)是该矩阵的x-y坐标……你和我谈论的是不同的事情。根据定义
fun(x,y)
根据某个函数或矩阵将值映射到每个(x,y)对。换句话说,在计算单个对(2,3)的
fun
时,您将使用标量
x=2
和标量
y=3
馈送
fun
,如下所示:
fun(2,3)
。现在,如果要计算几对的
fun
,该怎么办?
fun
的实现能否为
x
y
使用向量,例如
fun([2 10],[3 27])
?我认为
fun
不一定能处理这样的输入。+1,但请注意,它不仅更漂亮。Matlab可以并行化