数字信号处理软件方法Matlab课件_第1页
数字信号处理软件方法Matlab课件_第2页
数字信号处理软件方法Matlab课件_第3页
数字信号处理软件方法Matlab课件_第4页
数字信号处理软件方法Matlab课件_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MATLAB是什么?用于科学工程计算的高效率高级语言语言开发系统适合多学科、多种工作平台的功能强大的大型软件1MATLAB是什么?1MATLAB的主要构成编程语言:以矩阵和数组为基本数据单位的编程语言;工作环境:一系列应用工具提供编写、调试程序的环境;图形处理:包括绘制图形和创建GUI等。数学库函数:包含丰富的数学函数和其他复杂功能函数;API:为MATLAB与其它语言编写的程序进行交互提供接口。MATLAB的主要构成编程语言:以矩阵和数组为基本数据单位的MATLAB语言特点(一):采用统一的数据和变量对象——矩阵,即数据是矩阵元素的数据,变量是矩阵变量;在生成矩阵对象时,不要求做明确的维数说明,有丰富的矩阵处理功能;功能强、易学易用,还可根据实际需要扩充功能;一条语句或一个函数相当于C语言中的一个子程序或一个处理功能;MATLAB还拥有各种实用的软件,提供了许多通信系统模型,能对系统直接进行仿真;MATLAB语言特点(一):采用统一的数据和变量对象——矩阵MATLAB语言特点(二):用户可以自己编写函数,绘制系统响应曲线;MATLAB还具有符号运算功能,直接用符号算式进行演算;MATLAB提供了SIMULINK软件包,该软件包提供了通信和控制系统方块图的图形编程形式,这样利用通信系统方块图的图形对系统直接进行仿真,使得一个很复杂的系统仿真变得相当容易。MATLAB语言特点(二):用户可以自己编写函数,绘制系统响MATLAB采用了面向对象的技术,以矩阵作为基本数据结构和以矩阵运算为基础,集科学计算和图形可视化为一体。MATLAB是高层次的矩阵/数组语言,具有条件控制、函数调用、数据结构、输入输出、面向对象等程序语言特性。MATLAB还带有许多针对不同应用所开发的工具箱(Toolboxs)。5MATLAB语言特点(三):MATLAB采用了面向对象的技术,以矩阵作为基本数据结构和以MATLAB的其他主要特色:面向对象特性,图形、窗口等都是对象,可以通过属性改变它们;矩阵自动动态伸缩,矩阵的阶数几乎可以任意大(只与虚拟内存有关);功能强大的图形处理与数字计算功能;系统扩充方便,可以随时向系统增加函数;可以自己设计自己需要的工具箱。6MATLAB的其他主要特色:面向对象特性,图形、窗口等都是对MATLAB语言重要性MATLAB已成为各种系统仿真、数字信号处理、科学可视化的标准语言。MATLAB已确认为必须掌握的计算工具,是从理论通向实际的桥梁,是最可信赖的科技资源之一。7MATLAB语言重要性MATLAB已成为各种系统仿真、数字信MATLAB软件特点可归纳如下:简单易学;代码短小高效;计算功能非常强大;强大的图形表达功能;可扩展性能8MATLAB软件特点可归纳如下:简单易学;8MATLAB产品族可以用来进行如下工作:*数值分析;*数值和符号计算;*工程与科学绘图;*控制系统的设计与仿真;*数字图像处理;*数字信号处理;*通讯系统设计与仿真;*财务与金融工程。9MATLAB产品族可以用来进行如下工作:*数值分析;9操作桌面的缺省外貌10命令窗口(指令窗)工作空间窗口(浏览器)当前路径(当前目录)窗口命令历史窗口(历史指令窗)操作桌面的缺省外貌10命令窗口(指令窗)通用操作界面命令窗口(指令窗)(CommandWindow)工作空间窗口(浏览器)(WorkspaceBrowser)命令历史窗口(历史指令窗)(CommandHistory)当前路径(当前目录)窗口(CurrentDirectoryBrowser)内存数组编辑器(ArrayEditor)M文件编辑/调试器(Editor/Debugger)帮助导航/浏览器(HelpNavigator/Browser)图形窗口(Figure)11通用操作界面命令窗口(指令窗)(CommandWindow数值、变量和表达式(一)数值的记述(二)变量命名规则(三)MATLAB默认的预定义变量(四)运算符和表达式(五)复数和复数矩阵12数值、变量和表达式(一)数值的记述12(一

)数值的记述采用习惯的十进制表示,可带小数点或负号。以下记述都合法。3-990.0019.4561.3e-34.5e3313(一

)数值的记述采用习惯的十进制表示,可带小数点或负号。以(二

)变量命名规则变量名、函数名是对字母大小写敏感的。Myvar

myvar

MyVar

MyVarSin

SIN

sin变量名的第一个字符必须是英文字母,最多可包含31个字符(英文、数字和下连符)。myvar201变量名中不得包含空格、标点,但可包含下连符。my_var_201(对)my,var201(错)14(二

)变量命名规则变量名、函数名是对字母大小写敏感的。14(三)MATLAB默认的预定义变量每当MATLAB启动时,预定义变量(Predefinedvariable)就被产生。15建议:不要对预定义变量名重新赋值,以免产生混淆。(三)MATLAB默认的预定义变量每当MATLAB启动时,预(四

)运算符和表达式经典教科书上的算术运算符在MATLAB中的表达方式。16(四

)运算符和表达式经典教科书上的算术运算符在MATLABMATLAB书写表达式的规则:表达式由变量名、运算符和函数名组成。表达式将按与常规相同的优先级自左至右执行运算。优先级的规定是:指数运算级别最高,乘除运算次之,加减运算级别最低。括号可以改变运算的次序。书写表达式时,赋值符“=”和运算符两侧允许有空格,以增加可读性。17MATLAB书写表达式的规则:表达式由变量名、运算符和函数名(五)复数和复数矩阵MATLAB把复数作为一个整体处理,虚数单位用自定义变量i或j表示。复数z=a+bi=reiθ直角坐标表示和极坐标表示之间转换的MATLAB指令如下:real(z)z的实部a=rcosθimag(z)z的虚部b=rsinθabs(z)z的模r=√(a2+b2)angle(z)z的相角θ=arctg(b/a)MATLAB的矩阵元素允许是复数、复变量和由它们组成的表达式。18(五)复数和复数矩阵MATLAB把复数作为一个整体处理,虚数经典教科书的直角坐标表示法z1=3+4i采用运算符构成的直角坐标表示法和极坐标表示法z2=1+2*iz3=2*exp(i*pi/6)z=z1*z2/z319经典教科书的直角坐标表示法19指令行中的标点符号20指令行中的标点符号20例:a=10*2;b=a+5,c=a*b;d=c+a,A=[123;456;789]B=[1,234,5,6789]C=[1;2;3]21例:a=10*2;b=a+5,c=a*b;d=c+a,21命令窗口的常用控制指令22命令窗口的常用控制指令22命令窗口中指令行的编辑为方便操作,MATLAB不但允许用户在指令窗中对输入指令进行各种编辑和运行,而且允许用户对已经输入的指令进行回调、编辑和重运行。23命令窗口中指令行的编辑为方便操作,MATLAB不但允许用户在WorkspaceBrowser和ArrayEditor一、WorkspaceBrowser工作空间窗口简介列出数据的变量信息,包括变量名、变量数组大小(尺寸)、变量字节大小和变量类型。基本工作空间或简称为工作空间(Workspace)

MATLAB在进行运算时,将变量存储在内存中,这些存储变量的内存空间称为基本工作空间,简称工作空间。暂时(临时)工作空间:每当MATLAB在调用执行某一函数时,即进入该函数的暂时工作空间(可视为基本工作空间的下层空间),函数在此空间进行运算,而不影响到基本空间内的变量,当函数执行结束后,MATLAB会同时删除函数的暂时工作空间,并回到基本空间。24WorkspaceBrowser和ArrayEditor二、内存变量查阅、删除的指令操作法在指令窗中运用who,whos查阅MATLAB内存变量。who命令:查看现存于基本空间的变量whos命令:详细查看现存于基本空间的变量在指令窗中运用clear指令可以删除内存(工作空间内)的某一或所有变量如:clearA,clearall25二、内存变量查阅、删除的指令操作法在指令窗中运用who,wCommandHistory命令历史窗口历史指令窗记录着用户在MATLAB指令窗中所输入过的所有指令。历史记录包括:每次开启MATLAB的时间,每次开启MATLAB后在指令窗中运行过的所有指令。历史指令窗具有多种应用功能:单行或多行指令的复制和运行、生成M文件等。26CommandHistory命令历史窗口历史指令窗记录着用CurrentDirectory、路径设置器CurrentDirectory当前路径窗口简介一用户目录和当前目录设置二借助当前路径窗口获取M和MAT文件信息

MATLAB的搜索路径和路径设置器搜索路径27CurrentDirectory、路径设置器Current在matlab提示符下输入x,matlab解释器将按照以下步骤处理:1检查x是否为一个变量。2检查x是否为一个内部函数。3检查当前文件夹下是否存在x.dll,x.mex,x.m依次执行。4检查matlab搜索目录下是否存在x.dll,x.mex,x.m,依次执行path(‘c:\hello’,path);28在matlab提示符下输入x,matlab解释器将按照以下步Editor/DebuggerM文件编辑器简介M文件编辑器不仅可以编辑M文件,而且可以对M文件进行交互式调试;不仅可处理带.m扩展名的文件,而且可阅读和编辑其他ASCII码文件。M编辑器的启动方法29Editor/DebuggerM文件编辑器简介M文件编辑器M脚本文件编写初步所谓M脚本文件是指:该文件中的指令形式和前后位置,与解决同一个问题时在命令窗中输入的那组指令没有任何区别。MATLAB在运行这个脚本时,只是简单地从文件中读取一条条指令,送到MATLAB中去执行。与在指令窗中直接运行命令一样,脚本文件运行产生的变量都驻留在MATLAB基本工作空间中。文件扩展名是“.m”。30M脚本文件编写初步所谓M脚本文件是指:30M脚本文件编写初步所谓M脚本文件是指:该文件中的指令形式和前后位置,与解决同一个问题时在命令窗中输入的那组指令没有任何区别。MATLAB在运行这个脚本时,只是简单地从文件中读取一条条指令,送到MATLAB中去执行。与在指令窗中直接运行命令一样,脚本文件运行产生的变量都驻留在MATLAB基本工作空间中。文件扩展名是“.m”。31M脚本文件编写初步所谓M脚本文件是指:31帮助系统帮助方式概述一“纯文本”帮助二

“导航/浏览器交互界面”帮助三

PDF帮助四

其他帮助HelpNavigator/Browser帮助导航/浏览器简介一Contents帮助文件目录窗二

Index帮助索引窗三

Search搜索窗四

Favorites书签窗32帮助系统帮助方式概述32思考:一、指令clear,clf,clc各有什么用处?二、在MATLAB指令表达式中,标点符号“空格”和“逗号”各有什么作用?在哪些情况下,两者的作用相同?在哪些情况下,两者的作用不同?举例说明。33思考:一、指令clear,clf,clc各有什么用处?33MATLAB编程基础数据类型、数据结构和函数数值、比较和逻辑计算符号计算M文件——脚本和函数MATLAB绘图34MATLAB编程基础数据类型、数据结构和函数34MATLAB编程基础——数据类型、数据结构和函数35MATLAB定义了数值、字符、逻辑、符号和函数指针等多种数据类型MATLAB定义了矩阵、数组、单元数组和结构等多种数据结构函数是MATLAB的基本功能单元,调用方式为

函数名(参数1,参数2,…)MATLAB编程基础——数据类型、数据结构和函数35MATMATLAB编程基础——数值、比较和逻辑计算36MATLAB的数值运算MATLAB编程基础——数值、比较和逻辑计算36MATLABMATLAB编程基础——数值、比较和逻辑计算37MATLAB中的关系运算符MATLAB编程基础——数值、比较和逻辑计算37MATLABMATLAB编程基础——数值、比较和逻辑计算38MATLAB的逻辑运算MATLAB编程基础——数值、比较和逻辑计算38MATLABMATLAB编程基础——符号计算数值法描述信号是工程专业的基础,符号方法描述信号的优点:理论性强,简单直观符号变量的定义:

var=sym(str)或symsvar1var2…符号表达式到数值变量的转换:

subs(f,x,y) %用y替换掉表达式f中x39MATLAB编程基础——符号计算数值法描述信号是工程专业的基MATLAB编程基础——M文件(脚本和函数)MATLAB使用M语言进行编程(解释性语言)M语言文件其文件的扩展名为.m(脚本和函数)函数主要有两类,a内建(Build-in)函数,各类工具箱。b自己开发的函数(文件名为*.m或*.mex)运行meditor的方法:>>edit或“File”菜单中“New”子菜单40MATLAB编程基础——M文件(脚本和函数)MATLAB脚本文件脚本文件是指:该文件中的指令形式和前后位置,与解决同一个问题时在命令窗中输入的那组指令没有任何区别。MATLAB在运行这个脚本时,只是简单地从文件中读取一条条指令,送到MATLAB中去执行。与在指令窗中直接运行命令一样,脚本文件运行产生的变量都驻留在MATLAB基本工作空间中。文件扩展名是“.m”。41脚本文件脚本文件是指:4142meditor的运行界面

42meditor的运行界面流程控制选择结构当人们判断某一条件是否满足,根据判断的结果来选择不同的解决问题的方法时,就需要使用选择结构。和C语言类似,MATLAB的条件判断可以使用if语句或者switch语句。循环结构在解决很多问题的时候需要使用循环结构,例如求解数列的和或者进行某种迭代法求解数值方程时,都需要循环结构配合完成计算。在MATLAB中包含两种循环结构,一种是循环次数不确定的while循环,而另一种是循环次数确定的for循环。43流程控制选择结构43提高运算性能M语言和其他的高级语言不同,由于采用了解释型语言,所以M语言的执行效率肯定低于编译型语言(例如C语言)。然而,随着MATLAB版本的不断升级,再加之合理利用MATLAB向量运算等特点可以较大幅度地提高M语言代码的执行效率。在本小节结合一些具体的例子来讲述M语言编程以及MATLAB软件本身在提高程序执行效率方面的一些特性。44提高运算性能M语言和其他的高级语言不同,由于采用了解释型语言45

1.向量化运算首先,希望牢记这样一点,MATLAB最初的目的是提供便利的矩阵数据操作能力。所以在大多数的应用程序中,不要使用循环结构操作矩阵的元素,应直接使用矩阵元素的索引或者矩阵运算的函数,这样做不仅能够提高代码的执行效率,而且还能够提高程序的可读性,这就是所谓的向量化的运算,也就是说,尽量将使用while循环或者for循环的语句结构转换成等价的向量或者矩阵运算,以提高程序的运算速度。451.向量化运算46例子向量化运算——array_vs_loops.m。001 Mass=rand(5,10000);002 Length=rand(5,10000);003 Width=rand(5,10000);004 Height=rand(5,10000);005 006 [rows,cols]=size(Mass);007 008 disp([char(10),‘使用数组运算:’])%char(10)回车009 tic%t1=cputime010 Density=Mass./(Length.*Width.*Height);011 toc%t2=cputime012013 disp([char(10),'使用循环结构:'])%sprintf('%s\n','使用吗','sd')014 tic;015 forI=1:rows016 forJ=1:cols017 Density(I)=Mass(I,J)/(Length(I,J)*Width(I,J)*Height(I,J));018 end019 end020 toc

例子比较了循环结构和数组运算的执行效率,程序中分别在010行使用数组运算和在015~019行使用循环结构完成了同样的工作。程序的运行结果如下:>>array_vs_loops使用数组运算:elapsed_time= 0使用循环结构:elapsed_time= 0.010046例子向量化运算——array_vs_loops.m47

2.预分配存储空间另外一种能够提高运算效率的方法就是进行内存变量存储空间的预分配,首先察看例子。

例子内存预分配的例子——pre_allocate.m。001 disp([char(10),'使用内存预分配:'])002 pre_allo=zeros(10000,1);003 tic;004 forI=1:10000005 pre_allo(I)=rand(1);006 end007 toc008 009 disp([char(10),'不使用内存预分配:'])010 tic;011 forJ=1:10000012 not_pre_allo(J)=rand(1);013 end014 toc例子的执行结果如下:>>pre_allocate使用内存预分配:elapsed_time= 0.0900不使用内存预分配:elapsed_time= 0.3410472.预分配存储空间例子内存预分48

上面两种不同的运算惟一的区别就是程序002行,执行这行语句之后,MATLAB自动分配了10000个连续的内存空间用于存储数据,MATLAB将一次创建足够的存储空间,然后依次赋值。而后者not_pre_alloc变量没有进行相应的操作,所以带来了两次运算结果的不同。在不使用内存预分配的运算中,MATLAB是如何进行操作的呢?当I=1时,MATLAB将使用一小块长度为一个单元大小的内存保存一位随机数。当I=2时,MATLAB寻找一块两单元大小的内存区,一个单元放第一个随机数,第二个放另外一个随机数。当I=10000时,MATLAB寻找一块容纳10000单元的内存区存放以前的9999个随机数,同时把最新的一个随机数加入进去。代码运行的结果造成了存储空间的浪费,降低了程序的执行速度。所以,在编写M语言程序的时候需要尽量使用内存的预分配,而少使用或者不使用数组内存空间的自动扩充方式。

…48上面两种不同的运算惟一的区别就是程序00M文件调试M语言文件的编辑器——meditor不仅仅是一个文件编辑器,同时还是一个可视化的调试开发环境。在M文件编辑器中可以对M脚本文件、函数文件进行调试,以排查程序的错误。M文件的调试不仅可以在文件编辑器中进行,而且还可以在命令行中结合具体的命令进行,但是过程相对麻烦一些,所以重点讲述在M文件编辑器中进行可视化调试的过程。一般地来说,应用程序的错误有两类,一类是语法错误,另外一类是运行时的错误。其中,语法错误包括了词法或者文法的错误,例如函数名称的拼写错误等。而运行时的错误是指那些程序运行过程中得到的结果不是用户需要的情况。但是,由于M文件是一种解释型语言,语法错误和运行时的错误都只有在运行过程中才能发现,所以程序的调试往往是在程序无法得到正确结果时进行程序修正的惟一手段。49

M文件调试M语言文件的编辑器——meditor不仅M语言的断点(Breakpoints)为了能够有效地处理各种情况,M语言的断点类型除了类似C语言的用户定义的断点外,还有几种自动断点,分别为*StopifError。*StopifWarning。*StopifNaNorInf。*StopifAllErrors。这些自动断点可以在程序中设置,当程序运行过程中发生了错误或者警告,则程序运行中断,进入调试状态50M语言的断点(Breakpoints)M文件编辑器的Breakpoints菜单51M文件编辑器的Breakpoints菜单51调试程序的按钮52调试程序的按钮52函数文件M函数文件和脚本文件不同,函数文件不仅有自己特殊的文件格式,不同的函数还分别具有自己的工作空间。同其他高级语言类似,M函数文件也有局部变量和全局变量。53函数文件M函数文件和脚本文件不同,函数文件不仅有自己54例子函数文件示例——average.m。001 functiony=average(x)002 %AVERAGE求向量元素的均值003 %语法:004 %Y=average(X)005 %其中,X是向量,Y为计算得到向量元素的均值006 %若输入参数为非向量则出错007 008 009 [m,n]=size(x);010 %判断输入参数是否为向量011 if(~((m==1)|(n==1))|(m==1&n==1))012 %若输入参数不是向量,则出错013 error('Inputmustbeavector')014 end015 %计算向量元素的均值016 y=sum(x)/length(x);在MATLAB命令行中,键入下面的指令运行例子的代码:>>z=1:99;>>y=average(z)y=5054例子函数文件示例——average.m。在MATLAB函数文件基本结构*函数定义行*在线帮助*注释行*M语言代码55例子函数文件示例——average.m。001 functiony=average(x)002 %AVERAGE求向量元素的均值003 %语法:004 %Y=average(X)005 %其中,X是向量,Y为计算得到向量元素的均值006 %若输入参数为非向量则出错007 008 009 [m,n]=size(x);010 %判断输入参数是否为向量011 if(~((m==1)|(n==1))|(m==1&n==1))012 %若输入参数不是向量,则出错013 error('Inputmustbeavector')014 end015 %计算向量元素的均值016 y=sum(x)/length(x);函数文件基本结构*函数定义行55例子函数文件示例——av函数定义行这一行代码中包括关键字function、函数输出参数y、函数的名称average和函数的输入参数x。需要注意的是函数的名称,函数的名称定义要求必须以字符开头,后面可以用字符、数字和下划线的组合构成函数名称。MATLAB对函数名称的长度有限定,读者可以在自己的MATLAB中,通过执行namelengthmax函数获取相应的数值。假设该函数返回的数值为N,若函数的名称长度超过了N,则MATLAB使用函数名称的前N个字符作为函数名称。一般推荐将函数名称用小写的英文字符表示,同时函数的M文件名称最好和函数名称保持一致,若文件名称和函数名称不一致,则调用函数的时候需要使用文件名称而非函数名称。

56函数定义行这一行代码中包括关键字function、函数输出函数注释行M函数文件的在线帮助为紧随在函数定义行的注释行。在例子中,average函数的在线帮助为002~006行的注释行。若在MATLAB命令行中键入下面的指令:

>>helpaverage(average是文件名)在MATLAB的命令窗口中就会出现:57AVERAGE求向量元素的均值语法:

Y=average(X)

其中,X是向量,Y为计算得到向量元素的均值 若输入参数为非向量则出错函数注释行M函数文件的在线帮助为紧随在函数定义行的注释行。58

其中,在线帮助中比较重要而且特殊的是在线帮助的第一行,在MATLAB中将这行注释称为H1帮助行,它是在线帮助的第一行,若使用lookfor函数查询函数时,仅查询并显示函数的H1帮助行,例如,在MATLAB命令行中键入下面的指令:

>>lookforaverage在MATLAB的命令窗口中就会出现:AVERAGE求向量元素的均值MEANAverageormeanvalue.

由于H1帮助行的特殊作用,所以在用户自己定义M函数文件时,一定要编写相应的H1帮助行,对函数进行简明、扼要的说明或者解释。例子的010、012、015行代码分别是程序具体的注释行,这些注释行不会显示在在线帮助中,主要原因就是这些注释行没有紧随在H1帮助行的后面,从010行开始一直到文件的结尾都是M函数文件的代码行,这些代码行需要完成具体的算法,实现用户的具体功能。代码行就是用户开发的算法M语言的实现。58其中,在线帮助中比较重要而且特殊的是在线帮助的第子函数和私有函数同一个M函数文件中可以包含多个函数。如果在同一个M函数文件中包含了多个函数,那么将出现在文件中的第一个M函数称为主函数(primaryfunction),其余的函数称为子函数(subfunction)。M函数文件的名称一般与主函数的名称保持一致,其他函数都必须按照函数的基本结构来书写,每一个函数的开始都是函数定义行,函数的结尾是另一个函数的定义行的开始或者整个M文件的结尾(最后一个子函数的结尾就是文件结束符)。不过,子函数不像主函数,一般子函数没有在线帮助,子函数的作用范围有限,它只能被那些在定义子函数的M文件中定义的函数(包括主函数和其他子函数)调用,不能被其他M文件定义的函数调用。59子函数和私有函数同一个M函数文件中可以包含多个函数。如果在同私有函数在MATLAB中有一类函数被称为私有函数,这类函数被放置在名称为private的子目录中。每一个函数文件都是标准的M语言函数文件,没有特殊的关键字。但是,这些函数仅能被那些位于private子目录的上一层目录中的函数调用。例如,假设在MATLAB的搜索路径中包含路径\ProjectA,那么所有位于\ProjectA\private路径下的函数,只能在其上一层路径\Projec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论