无环函数调用Matlab/Octave中的向量/矩阵成员

Sin*_*int 5 matlab matrix octave

我从循环世界(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
Run Code Online (Sandbox Code Playgroud)

用法示例:

octave:47> d=[1:1000];
octave:48> mycurve=gauss(d, 1, 500, 100);
Run Code Online (Sandbox Code Playgroud)

现在,关于MATLAB/Octave的所有建议都说:只要你发现自己使用循环并想出更好的方法,就停止.

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

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

 function retval = newfun(v)
    retval = 42*(v^23); 
endfunction
Run Code Online (Sandbox Code Playgroud)

也许,它只是语法糖,这就是全部,但仍然有用的知识.

dka*_*itz 6

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

尝试这样的事情:

function r = newfun(v)
 r = a.*exp(-(v-b).^2./(2*c^2))
end
Run Code Online (Sandbox Code Playgroud)


yuk*_*yuk 6

该函数应如下所示:

function retval = gauss(v, a, b, c)
  retval = a*exp(-(v-b).^2/(2*c^2));
Run Code Online (Sandbox Code Playgroud)

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

代码矢量化指南

提高绩效的技术

还要记住,有时使用循环的代码可以更清晰地进行向量化,而最近引入的JIT编译器MATLAB可以很好地处理循环.