2013-08-31 4 views
0

У меня есть 3 коротких функции, которые я написал в 3 отдельных файлах m в Matlab.Вызов функции из другой функции?

Основная функция называется F_ и принимает один входной аргумент и возвращает вектор с 3 элементами.

Элементы 1 и 2 выходного сигнала из F_ (предположительно), рассчитанные с использованием функций в других 2-м файлах, позволяют называть их theta0_ и theta1_ на данный момент.

Вот код:

function Output = F_(t) 

global RhoRF SigmaRF 

Output = zeros(3,1); 

Output(1) = theta0(t); 
Output(2) = theta1(t) - RhoRF(2,3)*sqrt(SigmaRF(2,2))*sqrt(SigmaRF(3,3)); 
Output(3) = -0.5*SigmaRF(3,3); 

end 

и

function Output = theta0_(t) 

global df0dt a0 f0 SigmaRF 

Output = df0dt(t) + a0 + f0(t) + SigmaRF(1,1)/(2*a0)*(1-exp(-2*a0*t)); 

end 

и

function Output = theta1_(t) 

global df1dt a1 f1 SigmaRF 

Output = df1dt(t) + a1 + f1(t) + SigmaRF(2,2)/(2*a1)*(1-exp(-2*a1*t)); 

end 

я создал дескрипторы этих функций следующим образом:

F = @F_; 
theta0 = @theta0_; 
theta1 = @theta1_; 

Когда я бегу F_ через его ручка с любым значением t я получаю следующее сообщение об ошибке:

F_(1) 
Undefined function 'theta0' for input arguments of type 'double'. 

Error in F_ (line 9) 
Output(1) = theta0(t); 

Пожалуйста помогите. Что я здесь делаю неправильно?

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

+3

Вы определили его как 'theta0_' и назовем его' theta0'. Кроме того, вам не нужно вызывать его через дескриптор. – Oleg

ответ

2

Каждая функция имеет свое собственное рабочее пространство, и поскольку вы не создали внутри рабочего пространства функции F_, вы получите сообщение об ошибке.

Скорее всего, вам не нужен этот дополнительный уровень косвенности, и вы можете использовать theta0_ в своей функции.

Если вам не нужно, что дополнительный уровень косвенности, у вас есть несколько вариантов:

  • Передайте функцию ручки в качестве аргумента:

    function Output = F_ (t, theta0, theta1) 
        % insert your original code here 
    end 
    
  • Сделайте F_ вложенную функцию:

    function myscript(x) 
    
    % There must be some reason not to call theta0_ directly: 
    if (x == 1) 
        [email protected]_; 
        [email protected]_; 
    else 
        [email protected]_; 
        [email protected]_; 
    end 
    
        function Output = F_(t) 
         Output(1) = theta0(t); 
         Output(2) = theta1(t); 
        end % function F_ 
    
    end % function myscript 
    
  • Сделать функцию глобальной , Вы должны сделать это как в F_, и где вы установили theta0 и theta1. И убедитесь, что вы не используете глобальные переменные с тем же именем в другом месте в вашей программе для чего-то другого.

    % in the calling function: 
    global theta0 
    global theta1 
    
    % Clear what is left from the last program run, just to be extra safe: 
    theta0=[]; theta1=[]; 
    
    % There must be some reason not to call theta0_ directly. 
    if (x == 1) 
        [email protected]_; 
        [email protected]_; 
    else 
        [email protected]_; 
    end 
    
    F_(1); 
    
    % in F_.m: 
    function Output = F_(t) 
        global theta0 
        global theta1 
        Output(1)=theta0(t); 
    end 
    
  • использование evalin('caller', 'theta0')F_ изнутри. Это может привести к проблемам, если вы вызываете F_ из другого места, где theta0 не объявлен или даже не используется для чего-то другого.

+1

+1 для получения полного списка опций. –

+0

Привет, спасибо за подробный ответ. Несколько вопросов, что вы подразумеваете под косвенностью? Вы имеете в виду, что я могу вызывать функции из 'F_', используя их имена функций (' theta0_' и 'theta1_'), и не нужно использовать дескрипторы функций (' theta0' и 'theta1')? Может быть, я просто не получаю глобальные переменные, но для моей работы сейчас есть переменные в базовом рабочем пространстве, которые я хочу использовать этими функциями, не передавая их в функцию, например. 'df0dt a0 f0 SigmaRF'. Правильно ли это сделано в моих тета-функциях? – Fayyaadh

+0

Глобальные декларации выглядят хорошо, но вы также должны объявлять их глобальными в своей рабочей области базы. Или вы можете использовать 'df0dt = evalin ('base', 'df0dt');' в своих функциях для доступа к базовому рабочему пространству. По косвенности я подразумеваю, что прямой способ вызвать 'theta0_' - это ввести' theta0_'. Если вы не знаете заранее, какую функцию вы должны вызывать, вы можете добавить уровень косвенности: вы объявляете дескриптор функции и устанавливаете ее на правильную функцию, а на сайте вызова вы вызываете функцию, на которую указывает дескриптор. Это то, что вы сделали с 'theta0', который ссылается на' theta0_', но может быть изменен. – mars

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