【问题标题】:vectorizing function in octave / matlab八度音程/ matlab中的矢量化函数
【发布时间】:2015-01-26 15:33:07
【问题描述】:

我有一个函数,我想知道是否可以对其进行矢量化,而不必使用 for 循环。代码如下。

a=1:2:8
for jj=1:length(a)
     b(jj)=rtfib(a(jj)); %fibbonacci function
end
b

下面的输出:

a =

   1   3   5   7

>>>b =

    1    3    8   21

我试图这样做

t = 0:.01:10;
y = sin(t);

但是执行下面的代码没有任何建议? ps:我试图保留函数 rtfib 因为它的速度,我需要使用非常大的斐波那契数。我正在使用 octave 3.8.1

 a=1:2:8
 b=rtfib(a)

下面是请求的 rtfib 代码

function f = rtfib(n)

if (n == 0)
    f = 0;
elseif (n==1)
    f=1;
elseif (n == 2)
    f = 2;
else
    fOld = 2;
    fOlder = 1;
    for i = 3 : n
        f = fOld + fOlder;
        fOlder = fOld;
        fOld = f;
    end
end
end

【问题讨论】:

  • 这可能取决于您的rtfib 函数。你可以发布代码吗?而且,通过预分配b,即在循环输入b=zeros(size(a)) 之前,您可能会获得同样好的加速(如果您使用的是相当最新的Matlab 版本)。循环不再那么慢了
  • @Dan 当然,我已将 rtfib 代码添加到我使用 octave 3.8.1 的问题中,所以它还没有 matlab 快
  • 不要介意向量化,但是您可以使用 rtfib 的单个 for 循环来保存整个向量,而不是双 for 循环!线性而不是二次运行时!
  • 对于所有访问此帖子的 SO 用户,提供答案的 OP 和后续人员就高效快速地创建斐波那契数列进行了非常好的讨论。上面帖子中看到的代码来自这篇帖子:stackoverflow.com/questions/26829209/…

标签: matlab octave


【解决方案1】:

您可以看到您的函数rtfib 实际上计算了每个斐波那契数,直到n。 您可以对其进行修改,以便存储并返回所有这些数字,这样您只需使用所需的最大数字调用该函数一次:

function f = rtfib(n)

    f=zeros(1,n+1);
    if (n >= 0)
        f(1) = 0;
    end
    if (n>=1)
        f(2)=1;
    end
    if (n >= 2)
        f(3) = 2;
    end
    if n>2
        fOld = 2;
        fOlder = 1;
        for i = 3 : n
            f(i+1) = fOld + fOlder;
            fOlder = fOld;
            fOld = f(i+1);
        end
    end
end

(它将在 f(n+1) 中返回 fibonnaci(n),如果您不需要 0,您可以更改它以便它在 f(n) 中返回 fibonnaci(n),如果您愿意)

那你只需要调用

>>f=rtfib(max(a));
>>b=f(a+1)
b =

 1     3     8    21

如果您不想存储所有内容,可以稍微修改函数rtfib,以便将数组a 作为输入,计算斐波那契数直至max(a),但只存储需要一个,它会直接返回b。 这两种解决方案都会减慢rtfib 本身的速度,但它会比每次从 0 计算斐波那契数快得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    相关资源
    最近更新 更多