我的目标是使用MATLAB OOP设计在MATLAB中编程的可重复使用的引擎。这是我第一次尝试这样做。我想解决的问题如下:我有一个抽象类cPayoffBase
,它定义了未知类型支付的接口。继承cPayoffBase
,我有一个具体的类cPayoffCall
,它实现了一个调用选项。现在我定义了另一个类cVanillaDerivs
,它接受用户定义的支付对象和执行价格。当我将用户定义的对象传递给cVanillaDerivs
以计算某些数量的异常Index exceeds matrix dimensions.
曲面时。我将详细提供代码。
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
。请让我知道我的错误,如果可能的话,我怎样才能在MATLAB OOP中实现与C ++相同的过程。
答案 0 :(得分:1)
您的意思是rslt = obj.dmPayoffObj.mfGetPayoff(argSpotPrc);
而不是rslt = obj.dmPayoffObj(argSpotPrc);
吗?
答案 1 :(得分:1)
您正在尝试访问属性dmPayoffObj
的元素编号100。但是,此属性设置为payOffObj
,它不是数组。因此错误。
我认为你想要的是返回dmPayoffObj
的回报。您应该更改类mfGetDerivPayoff
的方法cVanillaDerivs
,如下所示:
function rslt = mfGetDerivPayoff(argSpotPrc)
rslt = obj.dmPayoffObj.mfGetPayoff(argSpotPrc);
end