我有一个函数,我想知道是否有可能对其进行矢量化而不必使用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
答案 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计算斐波那契数字快得多。