标签:style blog http io ar color os 使用 sp
Matlab也可以写面向对象的代码,首先表现在可以定义类,以及可以继承,使用类(class)有很多好处,其中一个重要的好处便是解决变量名冲突和让函数、对象的结构清晰。class的static function可以在不定义类的实例直接调用类的成员函数,比如定义
classdef tools < handle methods (Static = true) function a = test(b, c) a = b + c; end end end
a = tools.test(b, c);调用函数。
classdel是定义类名,后面的<是表示继承,Matlab允许多重继承,继承自handle类,handle类定义了很多关于object的处理函数,例如addListener以及notify还有delete等对对象的函数,是一个抽象类,不能实例化,具体可以看一下参考文献【2】。
类的方法是放在methods ...end里面。
下面是一个稍微复杂的类的定义
classdef TensileData properties Material = 'carbon steel'; SampleNumber = 0; Stress Strain end properties (Dependent) Modulus end methods function td = TensileData(material,samplenum,stress,strain) if nargin > 0 td.Material = material; td.SampleNumber = samplenum; td.Stress = stress; td.Strain = strain; end end % TensileData end methods function obj = set.Material(obj,material) if ~(strcmpi(material,'aluminum') ||... strcmpi(material,'stainless steel') ||... strcmpi(material,'carbon steel')) error('Material must be aluminum, stainless steel, or carbon steel') end obj.Material = material; end % Material set function function modulus = get.Modulus(obj) ind = find(obj.Strain > 0); % Find nonzero strain modulus = mean(obj.Stress(ind)./obj.Strain(ind)); end % Modulus get function function obj = set.Modulus(obj,~) fprintf('%s%d\n','Modulus is: ',obj.Modulus) error('You cannot set Modulus explicitly'); end function disp(td) fprintf(1,'Material: %s\nSample Number: %g\nModulus: %1.5g\n',... td.Material,td.SampleNumber,td.Modulus); end % disp function plot(td,varargin) plot(td.Strain,td.Stress,varargin{:}) title(['Stress/Strain plot for Sample ',num2str(td.SampleNumber)]) xlabel('Strain %') ylabel('Stress (psi)') end % plot end methods (Access = 'private') % Access by class members only function m = CalcModulus(td) % Over-simplified calculation of Elastic Modulus ind = find(td.Strain > 0); % Find nonzero strain m = mean(td.Stress(ind)./td.Strain(ind)); end % CalcModulus end end % classdef
在上述代码中,
classdef TensileData
...
end
是定义一个TensileData类。代码:
properties
Material = ‘carbon steel‘;
SampleNumber = 0;
Stress
Strain
end
是定义这个类的属性,也就是C++中类的成员变量。但是和C++不同的是,matlab中的类定义还有一个比较特别的地方的,就是定义依赖属性,如下述代码:
properties (Dependent)
Modulus
end
这表示Modulus这个属性是个依赖属性,它的值是通过其他属性计算得到的,其中Dependent的默认属性值为True。
它的值是通过下面函数实现的:
% Modulus get function
function modulus = get.Modulus(obj)
ind = find(obj.Strain > 0); % Find nonzero strain
modulus = mean(obj.Stress(ind)./obj.Strain(ind));
end
类的方法(函数)的定义是以methods ... end的的形式出现的。如下面的类方法的定义:
methods
function td = TensileData(material,samplenum,stress,strain)
if nargin > 0
td.Material = material;
td.SampleNumber = samplenum;
td.Stress = stress;
td.Strain = strain;
end
end
end
该函数块定义了TensileData构造函数方法。上述代码中的最后一个方法 methods (Access = ‘private‘)
中的Access = ‘private‘表示该方法仅能被类本身访问和修改,是个私有成员方法。其中属性Access又可分为
SetAccess和GetAccess,属性值和Access相同。
面向对象的使用必然导致程序的开销变高,关于相关的讨论可以看一下【1】:封装后的函数多次调用会话费相当长的时间
所以到底该不该封装,还需取决于实际情况,如果函数本身特别简单,并且会被循环调用,最好还是通过m文件函数的形式。之前MIT大牛给出了更多地建议
参考文献:
【1】http://zhiqiang.org/blog/it/class-wrapper-functions-in-matlab.html
【2】http://cn.mathworks.com/help/matlab/ref/handle.html?searchHighlight=handle
【3】http://www.cnblogs.com/magic-cube/archive/2011/11/08/2241580.html
【4】http://anony3721.blog.163.com/blog/static/5119742011911111232557/
标签:style blog http io ar color os 使用 sp
原文地址:http://blog.csdn.net/lansatiankongxxc/article/details/41748575