【问题标题】:Vectorisation of formula in MATLAB [closed]MATLAB中公式的向量化[关闭]
【发布时间】:2014-10-14 12:06:09
【问题描述】:

我正在创建向量的比较以检查它是否属于斐波那契数列。

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

【问题讨论】:

  • 我没有显示比较向量,因为它是一个输入函数。我的错误在于这里给出的公式。我需要更正这个公式以获得精确的向量 7 9 16 25 41
  • 我知道当 k = 3, i(1), i(2) 被考虑在内,但是当 k = 4, k = 5 它不会加起来之前的 i(k-1 ) + i(k-2)
  • 按原样,您的代码返回错误:Index exceeds matrix dimensions. 您是否在问题中发布的代码之前将i 初始化为向量?请始终发布minimal, complete, verifiable example
  • 是的。我确实初始化了
  • 除了@Jubobs 所说的,返回值f 从未在您的函数中赋值。

标签: matlab formula


【解决方案1】:

您不能向量化迭代过程。如果您只想对 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 包裹,因为我们希望斐波那契数是整数,但 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

【讨论】:

  • 用于输入随机向量以检查它是否属于“斐波那契数列”,可以是任何其他数字,例如 3 4 7 11 18
  • @Executor345 我不明白你的意思。您也可以致电f(121)f([1 42 17 3])
  • 这种方法的一个问题是你得到双打(1.0000)而不是“整数”(1);如果要与“整数”向量进行比较,那将不会飞。您应该在 f 函数的定义中添加一些舍入。
猜你喜欢
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
相关资源
最近更新 更多