matlab如何写一个类

类是一种数据类型,与普通的数据类型不同的是类不仅包含数据,还包含对数据的操作,类把数据和数据操作方法封装在一起,作为一个整体参与程序的运行。类具有可继承性,创建一个新的类的时候,可以在一个基类中添加成员派生出新类。类的变量和类的实例是不同的,类的实例是动态分配的内存区域,通常称类的实例维“对象”,同一个类可以有不同的实例存在,他们个子有自己的数据,但是数据操作方法是相同的。类的变量可以看作是一个指针,指向类的实例。 
在MATLAB中,为了更好地进行数据的封装,更加抽象地描述对象,也定义了类。

通常一个类应该包含四个基本的成员函数:
构造函数 ―― 与类名相同,可以在其中完成成员初始化的工作;
显示函数 ―― 名为display,用于显示成员的数据;
赋值函数 ―― 名为set,用于设置类成员的数值;
取值函数 ―― 名为get,用于读取类成员的函数。

与C++的类不同的是,MATLAB的类不需要特别的析构函数。如果类用到了一些特殊的内容需要释放的话,可以编写一个成员函数,比如classclear,用包来释放所占用的资源。
下面用一个简单的例子类介绍一些类如何使用

先看一个matlab中的类代码:

 1 classdef TensileData
 2    properties
 3       Material = ‘carbon steel‘;
 4       SampleNumber = 0;
 5       Stress
 6       Strain
 7    end
 8    properties (Dependent)
 9       Modulus
10    end
11
12    methods
13       function td = TensileData(material,samplenum,stress,strain)
14          if nargin > 0
15             td.Material = material;
16             td.SampleNumber = samplenum;
17             td.Stress = stress;
18             td.Strain = strain;
19          end
20       end % TensileData
21    end
22
23    methods
24       function obj = set.Material(obj,material)
25          if ~(strcmpi(material,‘aluminum‘) ||...
26                strcmpi(material,‘stainless steel‘) ||...
27                strcmpi(material,‘carbon steel‘))
28             error(‘Material must be aluminum, stainless steel, or carbon steel‘)
29          end
30          obj.Material = material;
31       end % Material set function
32
33       function modulus = get.Modulus(obj)
34          ind = find(obj.Strain > 0); % Find nonzero strain
35          modulus = mean(obj.Stress(ind)./obj.Strain(ind));
36       end % Modulus get function
37
38       function obj = set.Modulus(obj,~)
39          fprintf(‘%s%d\n‘,‘Modulus is: ‘,obj.Modulus)
40          error(‘You cannot set Modulus explicitly‘);
41       end
42
43       function disp(td)
44          fprintf(1,‘Material: %s\nSample Number: %g\nModulus: %1.5g\n‘,...
45             td.Material,td.SampleNumber,td.Modulus);
46       end % disp
47
48       function plot(td,varargin)
49          plot(td.Strain,td.Stress,varargin{:})
50          title([‘Stress/Strain plot for Sample ‘,num2str(td.SampleNumber)])
51          xlabel(‘Strain %‘)
52          ylabel(‘Stress (psi)‘)
53       end % plot
54    end
55
56    methods (Access = ‘private‘) % Access by class members only
57       function m = CalcModulus(td)
58          % Over-simplified calculation of Elastic Modulus
59          ind = find(td.Strain > 0); % Find nonzero strain
60          m = mean(td.Stress(ind)./td.Strain(ind));
61       end % CalcModulus
62    end
63 end % classdef

在上述代码中,

1 classdef TensileData
2   ...
3 end

是定义一个TensileData类。代码:

1  properties
2       Material = ‘carbon steel‘;
3       SampleNumber = 0;
4       Stress
5       Strain
6 end

是定义这个类的属性,也就是C++中类的成员变量。但是和C++不同的是,matlab中的类定义还有一个比较特别的地方的,就是定义依赖属性,如下述代码:

1 properties (Dependent)
2       Modulus
3 end

这表示Modulus这个属性是个依赖属性,它的值是通过其他属性计算得到的,其中Dependent的默认属性值为True。

它的值是通过下面函数实现的:

1 % Modulus get function
2 function modulus = get.Modulus(obj)
3          ind = find(obj.Strain > 0); % Find nonzero strain
4          modulus = mean(obj.Stress(ind)./obj.Strain(ind));
5 end

类的方法(函数)的定义是以methods ... end的的形式出现的。如下面的类方法的定义:

 1 methods
 2       function td = TensileData(material,samplenum,stress,strain)
 3          if nargin > 0
 4             td.Material = material;
 5             td.SampleNumber = samplenum;
 6             td.Stress = stress;
 7             td.Strain = strain;
 8          end
 9       end
10 end

该函数块定义了TensileData构造函数方法。上述代码中的最后一个方法 methods (Access = ‘private‘)

中的Access = ‘private‘表示该方法仅能被类本身访问和修改,是个私有成员方法。其中属性Access又可分为

SetAccess和GetAccess,属性值和Access相同。

在disp函数语句中出现“...”表示下一行和当前行是连接在一起的。如:

1 function disp(td)
2     fprintf(1,‘Material: %s\nSample Number: %g\nModulus: %1.5g\n‘,...
3        td.Material,td.SampleNumber,td.Modulus);
4 end

就表示第二行和第三行是连在一起的。

转自:http://www.cnblogs.com/magic-cube/archive/2011/11/08/2241580.html

参考文献:

http://www.cnblogs.com/snowxshy/p/3867868.html

http://blog.csdn.net/deeplearning/article/details/6234174

http://ycool.com/post/gxkf6q8

作者:wangduo

出处:http://www.cnblogs.com/wangduo/

本博客中未标明转载的文章归作者wangduo和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

扫码访问:

时间: 2024-11-04 11:09:04

matlab如何写一个类的相关文章

Java基础-接口.编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法void printCapitalLetter();在接口InterfaceB中有个方法void printLowercaseLetter();然 后写一个类Print实现接口InterfaceA和InterfaceB,要求 方法 实现输出大写英文字母表的功能,printLowerca

#34.编写2个接口:InterfaceA和InterfaceB:在接口InterfaceA中有个方法void printCapitalLetter():在接口InterfaceB中有个方法void printLowercaseLetter():然 后写一个类Print实现接口InterfaceA和InterfaceB,要求      方法 实现输出大写英文字母表的功能,printLowercaseLetter()方法实现输出小写英文 字母表的功能.再写一个主类E,在主类E的main方法中创建P

c++写一个类后编译发现class重定义

c++写一个类后编译发现class重定义 这种问题经常都是头文件互相包含导致的 在h文件开头加上 #pragma once 这样这个头文件只编译一次 避免了这个问题

使用类的静态字段和构造函数,请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。

1.程序设计思想 定义一个静态字段,在构造函数中写一个这个静态字段自加的语句,这样,因为静态字段不会因为再次调用而改变数值所以可以计算建立对象的个数. 2.程序源代码 //使用类的静态字段和构造函数跟踪对象 class sum{  public static int a=0;   int c;   public sum(int cc)  {   c=cc;   a++;  }  public int get()  {   return a;  } } public class WyText_LL

使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。

设计思想 定义一个静态字段,在构造函数中写一个静态字段自家的语句,这样,因为静态字段不会因为在此调用而改变数值所以可以计算建立对象的个数. 源代码 //使用静态字段和构造函数跟踪对象 package bao; public class sum { public static int a=0; int c; public sum(int cc) { c=cc; a++; } public int get() { return a; } } package bao; public class D_X

写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”

源代码: package jxl;class sum{ public static int a=0; int c1; public sum(int c2){ c1=c2; a++; } public int get(){ return a; }}public class Test4 { public static void main(String[] args) { // TODO 自动生成的方法存根 //调用 sum one=new sum(2); sum two=new sum(3); //

java能不能自己写一个类叫java.lang.System/String正确答案

原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.System? 网上提供的答案:通常不可以,但可以采取另类方法到达这个需求.所谓的另类方法指自己写个类加载器来加载java.lang.System到达目的. 首先表明下我的观点.上述答案完全是误导读者,是不正确的答案.我就疑惑了网上怎样把这类完全不正确的搜索结果排在前面,而且几近搜到的都是这类不正确的

面向切面编程AOP——加锁、cache、logging、trace、同步等这些较通用的操作,如果都写一个类,则每个用到这些功能的类使用多继承非常难看,AOP就是解决这个问题的

面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java中mybatis的@Transactional注解,大家知道被这个注解注释的函数立即就能获得DB的事务能力. 2)python中的with threading.Lock(),大家知道,被这个with代码块包裹的部分立即获得同步的锁机制. 这样我们把事务和加锁这两种与业务无关的逻辑抽象出来,在逻辑上解耦,并且可

能否自己也写一个类叫做java.lang.String?

这次的随笔很逗吧~没错,我们的确也可以自己在创建一个包java.lang,然后在 相应的包下面创建一个对应的类String,但是在每次jre运行的时候,我们都回去加载原来默认的java.lang.String,这样的话,重写和没有重写也就没有 什么作用了.但是如果在web应用中我们可以在WEB-INF/classess下面创建对应的String类,这样在每次启用tomcat的时候都会先去加载我们自己的 String类,但是这样会引入太多的问题了,原来所有的String类都会无法使用的.所以,非常

java写一个类,并测试它

这是Student类 package com.ma_0002; /** * 建立一个学生类,重写toString()方法 * @author TP * */ public class Student { /************成员变量区****************/ /**学生姓名*/ String name; /**学生年龄*/ int age; /************构造方法区****************/ public Student() { super(); } publ