八度/ matlab中的矢量化函数

时间:2015-01-26 15:33:07

标签: matlab octave

我有一个函数,我想知道是否有可能对其进行矢量化而不必使用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 ,因为它的速度,我需要使用非常大的Fibonacci数。我正在使用八度音阶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

1 个答案:

答案 0 :(得分:0)

您可以看到您的函数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作为输入,计算斐波纳契数最多为{{1但只存储所需的那个,它将直接返回max(a)。 两种解决方案都会减慢b本身的速度,但它比每次从0计算斐波那契数字快得多。