代码之家  ›  专栏  ›  技术社区  ›  Sint

matlab/octave中向量/矩阵成员的无环函数调用

  •  5
  • Sint  · 技术社区  · 14 年前

    我从循环世界(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 回复  |  直到 14 年前
        1
  •  6
  •   yuk    14 年前

    函数应该如下所示:

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

    我建议您阅读关于如何向量化代码和避免循环的matlab文档:

    Code Vectorization Guide

    Techniques for Improving Performance

    还请记住,有时带有循环的代码可以更清楚地表示为矢量化的代码,并且最近引入的JIT编译器matlab可以很好地处理循环。

        2
  •  6
  •   dkantowitz    14 年前

    在matlab中,运算符的前缀“.”是元素操作。

    尝试如下操作:

    function r = newfun(v)
     r = a.*exp(-(v-b).^2./(2*c^2))
    end
    
        3
  •  3
  •   mtrw    14 年前

    ARRAYFUN (及其亲属)通常是这样做的方式。

    但在你的特殊情况下,你可以

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

    这不仅仅是语法上的甜头;消除循环会使代码运行得更快。

        4
  •  1
  •   Jacob    14 年前

    对。

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