扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
关于matlab的数值积分
创新互联建站专注于隆安网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供隆安营销型网站建设,隆安网站制作、隆安网页设计、隆安网站官网定制、微信小程序开发服务,打造隆安网络公司原创品牌,更为您提供隆安网站排名全网营销落地服务。
-
[matlab应用]
函数3
rat,rats
功能
有理分式近似。虽然所有的浮点数值都是有理数,有时用简单的有理数字(分子与分母都是较小的整数)近似地表示它们是有必要的。函数rat将试图做到这一点。对于有连续出现的小数的数值,将会用有理式近似表示它们。函数rats调用函数rat,且返回字符串。
格式
[n,d]
=
rat(x)
%对于缺省的误差1.e-6*norm(x(:),1),返回阵列n与d,使n./d近似为x。
[n,d]
=
rat(x,tol)
%在指定的误差tol范围内,返回阵列n与d,使n./d近似为x。
rat(x)、rat(x…)
%在没有输出参量时,简单地显示x的连续分数。
import re
x = 'Cat eats rat.'
f = lambda x: [e.lower() for e in re.findall(r'\b\w+\b', x)]
a = f(x)
print(a)
最初知道matlab可以创建链表是通过阅读博客:在matlab中实现链表知道的。然后通过仔细阅读matlab帮助文档,终于自己搞明白如何利用matlab创建链表。首先介绍matlab中的类。
1 matlab中的class
起初认为matlab是面向过程式的语言,通过编写一系列函数或者脚本完成任务,但其实matlab中也可以通过创建类的方式实现面向对象编程。其实自己早就应该发现,在File的New菜单中第三项就是class(图一),但是囿于固有思维,从来没有深究过。
图1 matlab File菜单中New选项的菜单项
1.1 类文件夹
当要创建一个类时,我们应该将类文件放在什么位置。matlab为我们提供了两种方法:
1. 在matlab路径下创建一个文件夹,然后在文件夹中创建一个单独的自包含的类定义(图二);
2. 在matlab路径下,创建一个@+类名的文件夹,在其中创建一个类,同时我们可以将类的定义分散在多个文件中,也即该文件夹下都是该类的定义;
图2 方式一创建类
图3 方式二创建类
和其他高级语言(Java)类似,matlab还允许我们将这些类组织成包(packages)。包文件夹的父文件夹必须在matlab路径下,但是包文件夹不必。包文件夹以‘+’开头,可以包含多个类定义或者其他的包(图四)。一个包文件夹定义了一个新的命名空间,所以我们可以重用类名。引用包中的类或者函数时需要包含包名称,例如packagefld1.ClassNameA(),packagefld2.packageFunction()。
图4 包文件夹的结构
更多细节可参考matlab帮助中的Class Folders部分(在搜索框中输入Class Folders搜索即可)。
1.2 类定义
要创建一个类,matlab会自动帮我们生成一个类框架,一般如下:
classdef (attribute1 = value,...) classname( superclass_name)
properties
PropName
end
methods
methodName
end
events
EventName
end
end
类名必须要与文件名相同,第一个括号中声明类的属性,类似于java中的public等关键词,更详细的解释可参考:Class Attributes。第二个括号指明类是否需要继承父类,类似于java中的extends关键字或者C++中的‘:’。matlab支持多重继承,更详细的解释可参考:Creating Subclasses —Syntax and Techniques。在实现链表的过程中,我们需要继承handle类。完整的一个类模块如下图:
图5 一个完整的类模块
properties类似于java或C++中的成员变量,我们也可以给其设定各种访问属性,更详细的解释可参考:Defining Properties。
methods就是具体的函数实现。有很多种不同类型的函数,下面简要介绍:
普通函数(Ordinarymethods)。我们实现的大部分都是普通函数,它负责完成该类要完成的主要任务。
构造函数(Constructormethods)。和其他高级语言类似,也必须是类名,用来给属性赋值。唯一不同是它必须返回它创建的对象。更详细的解释可参考:Class Constructor Methods。
析构函数(Destructormethods)。名字必须是delete,用来释放空间。更详细的解释可参考:Handle Class Delete Methods。
属性访问函数(Propertyaccess methods)。类似于其他高级语言中的set、get函数。更详细的解释可参考:Controlling PropertyAccess。
静态函数(Staticmethods)。类似于其他高级语言中的静态函数,通过类对象进行访问。
转换函数(Conversionmethods)。是对其他类构造函数的重载,可以将自己定义类的对象转换成重载构造函数类的对象。更详细的解释可参考:Converting Objects to Another Class。
抽象函数(Abstractmethods)。无需解释,用来在子类中继承的函数。
对于events部分,自己缺乏了解,大家可以参考Defining Events and Listeners — Syntax and Techniques章节自己去研究。
1.3 普通函数
普通函数是我们平时写程序用的最多的函数,所以对其使用做更多的介绍。
1.3.1 基本构成
下面是一个函数演示:
classdef ClassName
methods (AttributeName = value,...)
function x =compute(obj,inc)
x = obj.y + inc;
end
end
end
可以看出其定义和在matlab中编写一个函数文件很类似,就是多了一个函数属性。同时我们需要注意:非静态函数需要显示包含类对象,matlab暂时不支持隐式调用类对象。
1.3.2 调用规则
当matlab调用一个普通函数时,它按如下规则决定该调用哪一个函数:
1. 方法的第一个参数对应类级别最高的情况下,调用该类的函数定义;
2. 上述类没有定义该函数,则从matlab路径中寻找函数。
针对规则一,matlab帮助中有一个例子:For example, suppose classA defines classB as inferior and supposeboth classes define a method called combine. Calling the method with an objectof classB and classA: combine(B,A),actuallycalls the combine method of classA because A is the dominant argument.
1.3.3 调用方式
调用类的函数时,我们可以采用两种方式:
1. 可以直接调用函数,然后第一个参数是类对象,或者
2. 将第一个参数类对象提到函数前面,然后加‘.’,类似于其他高级语言中的方法调用,推荐第二种方。
当然在极特殊的情况下,两种方式会得到不同的结果,具体可参考:Determining Which Method Is Invoked。
1.4 静态函数
静态函数一般用在不需要创建对象就可以调用的情况下。下面是一个具体的静态函数定义:
classdef myClass
...
methods(Static)
function p = pi(tol)
[n d] = rat(pi,tol);
p = n/d;
end
end
end
我们需要做的就是将函数的属性声明成Static,然后第一个参数也不必是类对象,调用的时候直接用类名调用。
2 matlab下链表的实现方法
在matlab示例代码中,包含一个双向链表的例子,就是一开始博客中提到的例子。该代码实现了一个双向链表值得我们仔细研究。其代码在目录:…\help\techdoc\matlab_oop\examples\@dlnode下。我们仿照该代码实现一个单向链表。
首先定义一个节点类node:
classdef node handle
properties
data
end
properties(SetAccess = public)
next
end
methods
function node = node(data)
if nargin 0
node.data=data;
end
end
end
end
该类必须继承于handle,然后有一个data属性,用来保存数据,和一个next属性,用来指向下一个节点。
之后定义一个链表类linkedlist:
classdef linkedlist handle
properties (GetAccess = public, SetAccess = public)
head
tail
size
end
methods
%创建一个空的链表,是构造函数
function list = linkedlist()
list.size=0;
end
%在链表的尾部添加一个元素
function append(list,node)
if isempty(list.head)
list.head=node;
list.tail=node;
else
list.tail.next=node;
list.tail=node;
end
list.size=list.size+1;
end
%从链表的头部删除一个元素
function temp=deletefromhead(list)
if isempty(list.head)
%disp('The linked list is empty');
temp=0;
list.size=0;
return;
else
temp=list.head;
list.head=list.head.next;
temp.next=[];
list.size=list.size-1;
end
end
end
end
从上述定义,我们可以看出matlab下的链表实现和c或java语言下很类似。这也说明了语言本身并不是非常重要,关键是要理解算法。
上面是我对matlab类和链表实现的理解,很多地方是从其帮助文档中直接翻译过来的,很多地方翻译的也不是很好,还请直接参看帮助文档。
## 语法错误改正 如下:
n=int(input("输入一个整数:"))
a1=0
a2=1
if n%2==0:
for i in range(n):
a1=a1+1
for i in range(n//2-1):
a2=a2+2
else:
for i in range(n):
a1=a2+1
for i in range(n//2):
a1=a2+2
print("从1到N相加的结果和从1到N奇数相加的结果分别是%d和%d"%(a1,a2))
其实应该如此吧:
n=int(input("输入一个整数:"))
a1=0
a2=0
for i in range(n+1):
a1=a1+i
for i in range(1,n+1,2):
a2=a2+i
print("从1到N相加的结果和从1到N奇数相加的结果分别是%d和%d"%(a1,a2))
python中怎么注释多行:
方法一:先选中要注释的段落,然后按下“ctrl+/”,即可实现多行代码的注释。效果如下:
请点击输入图片描述
再一次按下“ctrl+/”就可以取消注释。
方法二:跟注释单行一样在每一行前面输入“shift+#”。
1#r+=(i-arr[idx])*rat[idx]
2#print (i-arr[idx])*rat[idx]
3#i=arr[idx]
方法三:可以输入''' '''或者""" """,将要注释的代码插在中间,也可实现注释多行代码的效果。
关于MATLAB的数值积分 - [MATLAB应用]函数3 rat,rats 功能 有理分式近似.虽然所有的浮点数值都是有理数,有时用简单的有理数字(分子与分母都是较小的整数)近似地表示它们是有必要的.函数rat将试图做到这一点.对于有...
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流