5

我从循环世界(C等)进入矩阵世界

我想在向量/矩阵的每个单独成员上调用一个函数,并返回结果向量/矩阵。

这就是我目前的做法:

function retval = gauss(v, a, b, c)
  for i = 1:length(v)
    retval(i) = a*(e^(-(v(i)-b)*(v(i)-b)/(2*c*c)));
  endfor
endfunction

示例用法:

octave:47> d=[1:1000];
octave:48> mycurve=gauss(d, 1, 500, 100);

现在,关于 MATLAB/Octave 的所有建议都说:每当您发现自己使用循环并想出更好的方法时,请停止。

因此,我的问题是:可以在向量/矩阵的每个成员上调用一个函数,并在不使用显式循环的情况下一次将结果返回到一个新的向量/矩阵中吗?

那就是我正在寻找这样的东西:

 function retval = newfun(v)
    retval = 42*(v^23); 
endfunction

也许,它只是语法糖,仅此而已,但知道仍然有用。

4

4 回答 4

6

在 matlab 中的 '.' 运算符上的前缀是逐元素操作。

尝试这样的事情:

function r = newfun(v)
 r = a.*exp(-(v-b).^2./(2*c^2))
end
于 2010-03-18T15:13:21.387 回答
6

该函数应如下所示:

function retval = gauss(v, a, b, c)
  retval = a*exp(-(v-b).^2/(2*c^2));

我建议您阅读有关如何矢量化代码和避免循环的 MATLAB 文档:

代码向量化指南

提高性能的技术

还要记住,有时带有循环的代码比矢量化代码更清晰,并且随着最近引入的 JIT 编译器 MATLAB 可以很好地处理循环。

于 2010-03-18T15:14:42.460 回答
3

ARRAYFUN(及其亲属)是这样做的常用方法。

但在您的特定情况下,您可以这样做

mycurve = a*exp(-(d-b).^2/(2*c^2));

这不仅仅是语法糖;消除循环使您的代码运行得更快。

于 2010-03-18T15:17:53.910 回答
1

是的。

function retval = newfun(v)
    retval = a*exp(-((v-b).^2)/(2*c*c));
endfunction
于 2010-03-18T15:12:17.250 回答