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);调用函数。

1. 基础规则

classdel定义类名,<表示继承,Matlab允许多重继承,继承自handle类,handle类定义了很多关于object的处理函数。

类的方法是放在methods ...end里面。

下面一则实例:

classdef TensileData  % 定义类的名称properties  %% 定义类的属性,相当于C++中的成员函数Material = 'carbon steel';  SampleNumber = 0;  Stress  Strain  end  properties (Dependent)  %% 定义依赖型属性,该属性只能通过类内的方法进行赋值,参考modulus = get.Modulus(obj) 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') % 只能通过类的成员进行访问 私有成员方法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  

2. 关于封装造成的时间开销

面向对象的使用必然导致程序的开销变高,封装后的函数多次调用会话费相当长的时间。
所以到底该不该封装,还需取决于实际情况,如果函数本身特别简单,并且会被循环调用,最好还是通过m文件函数的形式。之前MIT大牛给出了更多地建议
1.虽然for-loop的速度有了很大改善,vectorization(向量化)仍旧是改善效率的重要途径,尤其是在能把运算改写成矩阵乘法的情况下,改善尤为显著。
2.在不少情况下,for-loop本身已经不构成太大问题,尤其是当循环体本身需要较多的计算的时候。这个时候,改善的关键在于改善循环体本身而不是去掉for-loop
3.MATLAB的函数调用过程(非built-in function)有显著开销,因此,在效率要求较高的代码中,应该尽可能采用扁平的调用结构,也就是在保持代码清晰和可维护的情况下,尽量直接写表达式和利用built-in function,避免不必要的自定义函数调用过程。在次数很多的循环体内(包括在cellfun, arrayfun等实际上蕴含循环的函数)形成长调用链,会带来很大的开销。
4.在调用函数时,首选built-in function,然后是普通的m-file函数,然后才是function handle或者anonymous function。在使用function handle或者anonymous function作为参数传递时,如果该函数被调用多次,最好先用一个变量接住,再传入该变量。这样,可以有效避免重复的解析过程。
5.在可能的情况下,使用numeric array或者struct array,它们的效率大幅度高于cell array(几十倍甚至更多)。对于struct,尽可能使用普通的域(字段,field)访问方式,在非效率关键,执行次数较少,而灵活性要求较高的代码中,可以考虑使用动态名称的域访问。
6.虽然object-oriented从软件工程的角度更为优胜,而且object的使用很多时候很方便,但是MATLAB目前对于OO的实现效率很低,在效率关键的代码中应该慎用objects。
7.如果需要设计类,应该尽可能采用普通的property,而避免灵活但是效率很低的dependent property。如非确实必要,避免重载subsref和subsasgn函数,因为这会全面接管对于object的接口调用,往往会带来非常巨大的开销(成千上万倍的减慢),甚至使得本来几乎不是问题的代码成为性能瓶颈。

文章引用:https://blog.csdn.net/beechina/article/details/50933860

matlab中定义类、面向对象编程相关推荐

  1. Matlab中的类定义 classdef

    Matlab也可以写面向对象的代码,首先表现在可以定义类,以及可以继承,使用类(class)有很多好处,其中一个重要的好处便是解决变量名冲突和让函数.对象的结构清晰.class的static func ...

  2. python 类中定义类_Python中的动态类定义

    python 类中定义类 Here's a neat Python trick you might just find useful one day. Let's look at how you ca ...

  3. python中什么叫类、什么叫对象_python中的类面向对象的基本概念!

    一.概述 今天我们讲述Python中的类&面向对象的基本概念. 首先我们为什么要学习面向对象,我讲一个故事,应该就可以明白了.在古时候,官府衙门如果要颁布什么告示就会去找工匠将命令中的字都雕刻 ...

  4. python中定义类

    3.2. 定义类 Python是完全面向对象的:可以定义自已的类,从自已的或内置类进行继承,然后对生成的类进行实例化. 在Python中定义类很简单:就象定义函数,没有独立的定义接口.只要定义类,然后 ...

  5. VC调用matlab中定义的.m文件中的函数的实例

    Matlab是一个强大的数学计算/仿真工具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数.但在很多情况下,我们不得不使用VC编程.那么,如何在VC中利用matlab的资源呢?在这里我 ...

  6. java 在一个类中定义类_Java 中程序代码必须在一个类中定义,类使用( )关键字来定义。_学小易找答案...

    [填空题]每一个 else 子句都必须和它前面的一个距离它最近的 子句相对应. [单选题]有关类的说法,正确的是( ) [单选题]在JAVA中,无论测试条件是什么,下列( )循环体 将至少执行一次. ...

  7. python如何定义类_python中定义类

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 类的定义python中,定义类是通过class关键字,例如我们定义一个存储学生信 ...

  8. matlab中的类标转换程序

    matlab中的类标转换程序 原始类标为Y,新类标为Y_new %进行排序,针对类标数目orig_labels = sort(unique(Y)); Y_new = Y;new_labels = 1: ...

  9. matlab中如何定义整形变量,MATLAB中定义变量的问题

    题目: MATLAB中定义变量的问题 比如说可以用syms定义 >> syms x11 x12 x13 x14 >> syms x21 x22 x23 x24 >> ...

最新文章

  1. linux 分区下的两主要硬盘的意思
  2. WINCE6.0操作系统---内核(kernel)学习
  3. 大型网站架构学习笔记
  4. 线程、协成、IO模型
  5. 《MySQL实战45讲》实践篇 9-15讲 学习笔记
  6. TCP的困境与解决方案
  7. java 英文字符串排序_英文字符串排序算法
  8. 数组tostring方法_数组toString()方法以及JavaScript中的示例
  9. html调用阅读模式,easyread.js—给网站开启阅读模式html教程
  10. Pytorch中的错误和bug
  11. 全局变量的使用和声明
  12. nginx基于tcp负载均衡
  13. windows平台下获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号
  14. 领英常见问题,猎头如何导出Linkedin全球6亿人才资料
  15. 这招涨粉神术,你不得不学
  16. python实现统计一个字符串中出现的字母和该字母出现的次数
  17. 用vs20008生成MFC项目,测试wince
  18. 专业计算机能力考试 技巧,计算机二级考试复习技巧
  19. Linux软件包企业实战案例
  20. 甲方乙方中的深刻哲理

热门文章

  1. vue2+ts中表格Ref滚动条置顶写法scrollTop = 0;
  2. 盲信号分离的实际应用
  3. c++中static的用法详解
  4. Android showStatusIcon on inactive InputConnection异常
  5. pycharm光标变粗变宽
  6. 一个 npm 包的坎坷“续命”之生
  7. Java中IO流体系
  8. LightWave 3D 2019 for Mac(三维动画制作软件)
  9. java md5库_Java常用类库API之MD5简单使用
  10. 【吊打面试官】计算机基础知识