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)
也许,它只是语法糖,这就是全部,但仍然有用的知识.
在matlab中'.' 运算符上的前缀是元素操作.
尝试这样的事情:
function r = newfun(v)
r = a.*exp(-(v-b).^2./(2*c^2))
end
Run Code Online (Sandbox Code Playgroud)
该函数应如下所示:
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可以很好地处理循环.