2013-10-01 3 views
0

Моя цель состоит в том, чтобы спроектировать многоразовый двигатель, запрограммированный в MATLAB, используя MATLAB OOP. Это моя первая попытка сделать это. Моя проблема, которую я хотел бы решить, заключается в следующем: у меня есть абстрактный класс cPayoffBase, который определяет интерфейс для выплаты неизвестного типа. Наследует cPayoffBase, у меня есть конкретный класс cPayoffCall, который реализует опцию вызова. Теперь я определил еще один класс cVanillaDerivs, который принимает определяемый пользователем объект выплат и цену исполнения. Когда я передаю в определяемом пользователем объекте значение cVanillaDerivs для вычисления количества исключений Index exceeds matrix dimensions.. Я предоставлю коды в деталях.MATLAB: OOP Функции вызова от другого класса

cPayoffBase.m

classdef (Abstract) cPayoffBase < handle 

    methods (Abstract) 
     mfGetPayoff(argSpotPrc) 
    end 

end 

cPayoffCall.m

classdef cPayoffCall < cPayoffBase 

    properties (GetAccess = private, SetAccess = private) 

     dmStrikePrc 

    end 

    methods 

    function obj = cPayoffCall(argStrikePrc) 

     obj.dmStrikePrc = argStrikePrc; 

    end 

    function rslt = mfGetPayoff(obj, argSpotPrc) 

     rslt = max(argSpotPrc - obj.dmStrikePrc, 0.0); 

    end 

end 

cVanillaDerivs.m

classdef cVanillaDerivs 

%% Data Members 
properties (GetAccess = private, SetAccess = private) 
    dmPayoffObj 
    dmExpiryDt 
end 

%% Implementation 
methods 

    % Constructor 
    function obj = cVanillaDerivs(argPayoffObj, argExpiryDt) 

     obj.dmPayoffObj = argPayoffObj; 
     obj.dmExpiryDt = argExpiryDt; 

    end 

    % Member Functions 
    function rslt = mfGetExpriyDt(obj) 

     rslt = obj.dmExpiryDt; 

    end 

    function rslt = mfGetDerivPayoff(argSpotPrc) 

     rslt = obj.dmPayoffObj(argSpotPrc); 

    end 
end 
end 

командное окно

>> clear classes 
>> spot = 100; strike = 50; T = 1; 
>> payoffObj = cPayoffCall(strike); 
>> typeVanilla = cVanillaDerivs(payoffObj, T); 
>> mfGetDerivPayoff(typeVanilla, spot) 
Index exceeds matrix dimensions. 

Error in cVanillaDerivs/mfGetDerivPayoff (line 37) 
      rslt = obj.dmPayoffObj(argSpotPrc); 

В C++, учитывая, что у меня есть класс-оболочка и обертывание объекта класса cPayoffBase Я могу сделать что-то вроде return (*dmPayoff)(dmSpotPrc) для функции двойного возврата mfGetDerivPayoff(double dmSpotPrc) const в классе cVanillaDerivs. Пожалуйста, сообщите мне свои ошибки и, если возможно, как я могу добиться того же процесса в OAT MATLAB, как C++.

ответ

1

Вы пытаетесь получить доступ к элементу номер 100 объекта dmPayoffObj. Однако для этого свойства установлено значение payOffObj, которое не является массивом. Таким образом, ошибка.

Что я думаю, что вам нужно, так это вернуть выплату dmPayoffObj. Вы должны изменить метод mfGetDerivPayoff класса cVanillaDerivs следующим образом:

function rslt = mfGetDerivPayoff(argSpotPrc) 
    rslt = obj.dmPayoffObj.mfGetPayoff(argSpotPrc); 
end 
+0

Ах. поэтому нужно '.' вызвать функцию' mfGetPayoff() '. Все эти вопросы пишут для отличного ответа. Спасибо. – AnonymousJ

1

Возможно, вы имели в виду rslt = obj.dmPayoffObj.mfGetPayoff(argSpotPrc); вместо rslt = obj.dmPayoffObj(argSpotPrc);?

+0

Да проблема и решение, которое вы и @Christian при условии, что работали. Спасибо. – AnonymousJ

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