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
函数的定义中添加一些舍入。