MATLAB中公式的矢量化

MATLAB中公式的矢量化,matlab,formula,Matlab,Formula,我正在创建一个向量的比较,以检查它是否是斐波那契序列 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

我正在创建一个向量的比较,以检查它是否是斐波那契序列

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

不能对迭代过程进行矢量化。如果只想对lulz进行矢量化,可以使用第n个Fibonacci数的直接公式

>> 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

我没有显示比较向量,因为它是一个输入函数。我的错误在于这里给出的公式。我需要对这个公式进行修正以得到精确的向量7 9 16 25 41我知道当k=3时,I(1),I(2)被考虑在内,但当k=4,k=5时,它不会按原样加上之前的I(k-1)+I(k-2),您的代码返回一个错误:
索引超出了矩阵维度。
在问题中发布代码之前,是否将
i
初始化为向量?请总是发一个。是的。我做了初始化除了@Jubobs说的,返回值
f
从未在函数中赋值。对于随机向量的输入,检查它是否为“斐波那契序列”,它可以是任何其他数字,如3 4 7 1118@Executor345我不明白你的意思。您也可以调用
f(121)
f([142 17 3])
。这种方法的一个问题是,您得到的是双精度(
1.0000
)而不是“整数”(
1
);如果要执行与“整数”向量的比较,则这将不起作用。您应该在
f
函数的定义中添加一些舍入。