2014-10-14 6 views
-4

Я создаю сравнение вектора, чтобы проверить, имеет ли он последовательность Фибоначчи.Векторизация формулы в MATLAB

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 

как я vectorise эту часть кода?

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

Я не показывал вектор сравнения, поскольку это функция ввода. моя ошибка заключается в приведенной здесь формуле. Мне нужна поправка к этой формуле, чтобы получить точный вектор 7 9 16 25 41 – Executor345

+0

Я понимаю, что когда k = 3, i (1), i (2) учитываются, но когда k = 4, k = 5, то n 't добавить предыдущий i (k-1) + i (k-2) – Executor345

+0

Как есть, ваш код возвращает ошибку: «Индекс превышает размеры матрицы». Вы инициализируете 'i' как вектор перед кодом, размещенным в вашем вопрос? Всегда указывайте [минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve). – Jubobs

ответ

2

Вы не можете векторизовать итеративную процедуру. Если вы хотите векторизации только для лулзов, вы можете вместо этого использовать прямую формулу для п го числа Фибоначчи

>> 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 именно число Фибоначчи от 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 
+0

для ввода случайных векторов для проверки, является ли он «последовательностью фибоначчи», которая может быть любыми другими цифрами, такими как 3 4 7 11 18 – Executor345

+1

@ Исполнитель345 Я вас не понимаю. Вы можете также называть 'f (121)' или 'f ([1 42 17 3])'. – Lumen

+1

Одна из проблем с этим подходом заключается в том, что вместо «целых чисел» ('1') вы получаете парные разряды (' 1.0000'); который не будет летать, если необходимо провести сравнение с вектором «целых чисел». Вы должны добавить некоторое округление внутри определения вашей функции 'f'. – Jubobs

Смежные вопросы