MATLAB中公式的矢量化

时间:2014-10-14 12:06:09

标签: matlab formula

我正在创建一个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

1 个答案:

答案 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是否包含从jk的斐波纳契数字,您可以调用

>> all(f(j:k) == fibs(:)')

其中fibs(:)'将向量转换为行向量。例如,

>> j = 5;
>> k = 10;
>> fibs = [5 8 13 31 34 55];
>> all(f(j:k) == fibs(:)')

ans = 

     1