2013-04-18 3 views
0

Я работаю над назначением, где должно быть найдено число собственных значений тридиагональной симметричной матрицы, расположенной в интервале [a, b). Мне нужно использовать алгоритм деления пополам, чтобы найти эти собственные значения, и их нужно выводить в виде вектора E. Функция - это функция [E] = bisection (A, a, b, tol), поскольку tol является допустимым пределом погрешности ,Рекурсивно добавление к вектору в MATLAB

% If tolerance is met, add (a + b)/2 to E as many times as there are 
% eigenvalues left in [a,b). This is the recursive stopping criterium. 
if(b - a < tol) 
    for i = 1:n 
     E = [E; (a + b)/2]; 
    end 
end 

% If there are eigenvalues left in [a,b), add new eigenvalues to E through 
% recursion. 
if(n > 0) 
    E = [E; bisection(A, a, (a+b)/2, tol); bisection(A, (a+b)/2, b, tol)]; 
end 

E = []; 

То, что я пытаюсь сделать, - это расширить вектор E с помощью другого вызова функции деления пополам. Только получаю эту ошибку:

??? Undefined function or variable "E". 

Error in ==> bisection at 56 
    E = [E; bisection(A, a, (a+b)/2, tol); bisection(A, (a+b)/2, b, tol)]; 

Я уже сделал пустой вектор E, который я, очевидно, не могу использовать внутри функции. Итак, есть ли способ рекурсивно развернуть вектор?

+0

Вы пытаетесь собрать неизвестную E с результатами. Попробуйте инициализировать E нулями или NaNs – fpe

ответ

2

Если вы не можете поместить свой пустой стартовый вектор в функцию, вы должны передать его как входной аргумент.

Это то, что код верхнего уровня может выглядеть, например:

E = []; 
E = myRecursiveFunction(E,inputs,stoppingCriteria) 
+0

Спасибо. Я предположил, что Matlab будет использовать эту переменную, даже если она не была передана в качестве аргумента. – user2295313

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