我正在创建一个vector的比较,以检查它是否属于Fibonacci序列。
function f = fibo(n)
f(1)=7;
f(2)=9;
k=3:5;
f(k)=f(k-1)+f(k-2)
ans=isequal(n,f)
输出显示
f =
7 9 16 9 0
而不是
7 9 16 25 41
我如何向这部分代码进行矢量化?
if n == 1,
f = 1; % First element is 1.
return;
elseif n == 2
f = [1 1]; % First two elements are 1.
else
% Call fibrec with previous result and compute next one from it.
fm1 = fibrec(n-1);
f = [fm1 fm1(end)+fm1(end-1)];
end
答案 0 :(得分:2)
您无法对迭代过程进行矢量化。如果你想为lulz进行矢量化,你可以改为使用直接公式来计算 n 斐波纳契数
>> f = @(n) round(1/sqrt(5) * (((1 + sqrt(5))/2).^n - ((1 - sqrt(5))/2).^n));
>> f(1:5)
ans =
1 1 2 3 5
f
中的计算由round
包裹,因为我们希望Fibonacci数字为整数,但sqrt
返回双精度数(感谢Jubobs)。
请注意,即使此代码由MATLAB进行矢量化,迭代过程仍可能更快。
现在,如果您想检查数组fibs
是否包含从j
到k
的斐波纳契数字,您可以调用
>> all(f(j:k) == fibs(:)')
其中fibs(:)'
将向量转换为行向量。例如,
>> j = 5;
>> k = 10;
>> fibs = [5 8 13 31 34 55];
>> all(f(j:k) == fibs(:)')
ans =
1