第二章矩阵运算_第1页
第二章矩阵运算_第2页
第二章矩阵运算_第3页
第二章矩阵运算_第4页
第二章矩阵运算_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、 MatlabMatlab程序设计程序设计第二章第二章 学习要求学习要求1、掌握矩阵、数组的创建方法和他们的算术、关、掌握矩阵、数组的创建方法和他们的算术、关系及逻辑运算系及逻辑运算2、掌握矩阵的特殊操作、掌握矩阵的特殊操作3、掌握补充的内容、掌握补充的内容第二章第二章 数值数组及其运算数值数组及其运算(矩阵运算基础)(矩阵运算基础)数值数组(数值数组(Numeric Array)和数组运算和数组运算(Array Operations)是是MATLAB的核心内容。的核心内容。 MatlabMatlab程序设计程序设计引导引导 l数组数组:是指由一组实数或复数排成的长方阵列:是指由一组实数或复数

2、排成的长方阵列(Array)。)。l数组运算数组运算:是指无论在数组上施加什么运算(:是指无论在数组上施加什么运算(+、-、或函数),总认为那种运算对被运算数组中的每个元或函数),总认为那种运算对被运算数组中的每个元素(素(Element)平等地实施同样的操作。)平等地实施同样的操作。lMATLAB精心精心设计设计数组和数组运算的数组和数组运算的目的目的在于:在于:使计算程序简单、易读,使程序指令更接近于教科书上的数学使计算程序简单、易读,使程序指令更接近于教科书上的数学计算公式;计算公式;提高程序的向量化程度,提高计算效率,节省计算机开销。提高程序的向量化程度,提高计算效率,节省计算机开销。

3、l例:例:时的曲线。在绘制函数10 xxeyx MatlabMatlab程序设计程序设计数组、矩阵的基本运算数组、矩阵的基本运算lMATLAB语言最基本的特点在于矩阵运算,绝语言最基本的特点在于矩阵运算,绝大多数的变量和数据都可看成为矩阵变量和矩大多数的变量和数据都可看成为矩阵变量和矩阵数据。阵数据。l应用应用MATLAB语言编程时,尤其要语言编程时,尤其要注意注意矩阵的矩阵的阶数和向量的维数问题。阶数和向量的维数问题。l标量可看作标量可看作11阶的矩阵。阶的矩阵。 MatlabMatlab程序设计程序设计第一节第一节 数组与矩阵的创建数组与矩阵的创建l一维数组的创建一维数组的创建l二维数组的

4、创建二维数组的创建l多(高)维数组的创建多(高)维数组的创建 MatlabMatlab程序设计程序设计一维数组的创建一维数组的创建l(1)逐个元素输入法逐个元素输入法 x=2 pi/2 sqrt(3) 3+5i l(2)冒号生成法冒号生成法通过通过“步长步长”设定,生成一维设定,生成一维“行行”数组的方法。数组的方法。通用格式:通用格式:x=a:inc:bl(3)定数线性采样法定数线性采样法 在设定的在设定的“总点数总点数”下,均匀采样生成一维下,均匀采样生成一维“行行”数组。数组。通用格式:通用格式:x=linspace(a,b,n)说明说明该指令生成(该指令生成(1 n)数组,其作用与)数

5、组,其作用与x=a:(b-a)/(n-1):b同。同。 MatlabMatlab程序设计程序设计一维数组的子数组寻访和赋值一维数组的子数组寻访和赋值 l例例1:子数组的寻访(:子数组的寻访(Address)。)。 l例例2:子数组的赋值(:子数组的赋值(Assign)。)。 MatlabMatlab程序设计程序设计二维数组的创建二维数组的创建l二维数组二维数组:是由实数或复数排列成矩形而构成的。是由实数或复数排列成矩形而构成的。从数据结构上看,矩阵和二维数组没有什么区别。当从数据结构上看,矩阵和二维数组没有什么区别。当二维数组带有线性变换时,该二维数组就是矩阵。二维数组带有线性变换时,该二维数

6、组就是矩阵。l直接输入法直接输入法 l利用利用M文件创建和保存数组文件创建和保存数组 MatlabMatlab程序设计程序设计直接输入法直接输入法l对于较小数组,从键盘上直接输入最方便。对于较小数组,从键盘上直接输入最方便。l二维数组必须有以下二维数组必须有以下三个要素三个要素:整个输入数组必须以方括号整个输入数组必须以方括号“ ”为其首尾;为其首尾;数组的行与行之间必须用分号数组的行与行之间必须用分号“;”或回车键或回车键【 Enter 】隔离;】隔离;数组元素必须由逗号数组元素必须由逗号“,”或空格分隔。或空格分隔。l实例实例 MatlabMatlab程序设计程序设计利用利用M文件创建和保

7、存数组文件创建和保存数组l对于今后经常需要调用的数组,尤其是比较大对于今后经常需要调用的数组,尤其是比较大而复杂的数组,为它专门建立一个而复杂的数组,为它专门建立一个M文件是值得文件是值得的。的。lM文件的创建过程文件的创建过程 MatlabMatlab程序设计程序设计二维数组元素的标识(编号)二维数组元素的标识(编号)l “全下标全下标”标识标识l “单下标单下标”标识标识l “逻辑逻辑1”标识标识 MatlabMatlab程序设计程序设计“全下标全下标”标识标识l“全下标全下标”标识法标识法:即指出是:即指出是“第几行,第几列第几行,第几列”的元素。的元素。l优点优点:几何概念清楚,引述简

8、单。:几何概念清楚,引述简单。l对于二维数组来说,对于二维数组来说, “全下标全下标”标识由两个下标识由两个下标标组成组成:行下标,列下标。:行下标,列下标。l例例:矩阵矩阵A= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 则则 A(2,3)= 8 , A(3,2)= 12 A(3,5)= 15 , A(1,5)= 5 MatlabMatlab程序设计程序设计“单下标单下标”标识标识l“单下标单下标(Linear Index)”标识标识:就是就是“只用一个下标来指明元素在数组中的位置只用一个下标来指明元素在数组中的位置”。l“一维编号一维编号”:先设想把二维数组的所

9、有列,按先左后右的次序、首先设想把二维数组的所有列,按先左后右的次序、首尾相接排成尾相接排成“一维长列一维长列”;然后,自上往下对元素位;然后,自上往下对元素位置进行编号。置进行编号。l例例:矩阵矩阵A= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 则则 A(2)=6, A(5)=7 , A(8)= 8 ,A(12)= 14 MatlabMatlab程序设计程序设计l“单下标单下标”与与“全下标全下标”的的转换关系转换关系:以以(mn)的二维数组的二维数组A为例,若为例,若“全下标全下标”元素位置元素位置是是“第第r行,第行,第c列列”,那么相应的,那么相应的“单下

10、标单下标”为为l=(c-1) m+r。lMATLAB有两个指令可实现以上表示方法间的有两个指令可实现以上表示方法间的转换:转换:Sub2ind 据全下标换算出单下标。据全下标换算出单下标。Ind2sub 据单下标换算出全下标。据单下标换算出全下标。 MatlabMatlab程序设计程序设计“逻辑逻辑1”标识标识l所谓所谓“逻辑逻辑1”标识标识 法法是:通过与是:通过与A同样大小的同样大小的逻辑数组逻辑数组L中中“逻辑值逻辑值1”所在的位置,指出所在的位置,指出A中中元素的位置。元素的位置。lL的元素或是的元素或是0或是或是1,它是,它是“逻辑数组逻辑数组(Logical Array)”。是一种

11、特殊的数据类型。是一种特殊的数据类型。l例例 MatlabMatlab程序设计程序设计二维数组的子数组寻访和赋值二维数组的子数组寻访和赋值 l子数组寻访和赋值格式汇总表子数组寻访和赋值格式汇总表l不同赋值方式示例不同赋值方式示例 MatlabMatlab程序设计程序设计子数组寻访和赋值格式汇总表子数组寻访和赋值格式汇总表 子数组寻访和赋值子数组寻访和赋值使使 用用 说说 明明A(r,c)A(r,c)它由它由A A的的“r r指定行指定行”和和“c c指定列指定列”上的元素组成上的元素组成A(r,:)A(r,:)它由它由A A的的“r r指定行指定行”和和“全部列全部列”上的元素组成上的元素组成

12、A(:,c)A(:,c)它由它由A A的的“全部行全部行”和和“c c指定列指定列”上的元素组成上的元素组成A(:)A(:)“单下标元素单下标元素”寻访。它由寻访。它由A A的各列按自左到右的次序,首尾相接而生成的各列按自左到右的次序,首尾相接而生成“一维长列一维长列”数数组组A(s)A(s)“单下标单下标”寻访。生成寻访。生成“s s指定的指定的”一维数组。一维数组。S S若是若是“行数组行数组”(或(或“列数组列数组”),则),则A(s)A(s)就是长度相同的就是长度相同的“行数组行数组”(或(或“列数组列数组”)A(L)A(L)“逻辑逻辑1”1”寻访。生成寻访。生成“一维一维”列数组:由

13、与列数组:由与A A同样大小的同样大小的“逻辑数组逻辑数组”L L中的中的“1”1”元素元素选出选出A A的对应元素;按的对应元素;按“单下标单下标”次序排成长列组成。次序排成长列组成。A(r,c)=SaA(r,c)=Sa以以“双下标双下标”方式,对子数组方式,对子数组A(r,c)A(r,c)进行赋值;进行赋值;SaSa的的“行宽、列长行宽、列长”必须与必须与A(r,c)A(r,c)的的“行宽、列长行宽、列长”相同相同A(:)=D(:)A(:)=D(:)全元素赋值方式。结果:保持全元素赋值方式。结果:保持A A的的“行宽、列长行宽、列长”不变。条件:不变。条件:A A、D D两个数组的总元素相

14、两个数组的总元素相等,但等,但“行宽、列长行宽、列长”不一定相同不一定相同A(s)=SaA(s)=Sa按按“单下标单下标”方式,对方式,对A A的部分元素重新赋值。结果:保持的部分元素重新赋值。结果:保持A A的的“行宽、列长行宽、列长”不变。条不变。条件:件:s s单下标数组的长度必须与单下标数组的长度必须与“一维数组一维数组” ” SaSa的长度相等,但是的长度相等,但是s s、SaSa不一定同是不一定同是“行行数组数组”或或“列数组列数组” MatlabMatlab程序设计程序设计多(高)维数组的定义多(高)维数组的定义l数组的第一维称为数组的第一维称为“行(行(Row)”,第二维称,第

15、二维称为为“列(列(Column)”,第三维称为,第三维称为“页页(Page)”,第四维称为,第四维称为“箱箱(Box)”, MatlabMatlab程序设计程序设计多(高)维数组的创建多(高)维数组的创建l创建创建多多维数组最常用的四种维数组最常用的四种方法方法:直接通过全下标元素赋值方式创建直接通过全下标元素赋值方式创建多多维数组;维数组;由若干同样大小的低维数组组合成由若干同样大小的低维数组组合成多多维数组;维数组;由函数由函数ones,zeros,rand,randn直接创建标准直接创建标准多多维维数组;数组;借助借助cat,repmat,reshape等函数构作等函数构作多多维数组。

16、维数组。例例 MatlabMatlab程序设计程序设计多维数组的标识多维数组的标识l数组的维数(数组的维数(Dimension)和)和ndims指令指令指令指令ndims(A)可直接给出数组可直接给出数组A的维数。的维数。l数组的大小(数组的大小(Size)和)和size指令指令不管不管A数组的维数是多少,数组的维数是多少,size(A)可给出可给出A各维的大各维的大小,而指令小,而指令length(A)可给出所有维中的最大长度。可给出所有维中的最大长度。即即length(A)等价于等价于max(size(A)。 MatlabMatlab程序设计程序设计第二节第二节 数组运算(点运算)数组运算

17、(点运算)l数组运算数组运算:是指无论在数组上施加什么运算:是指无论在数组上施加什么运算(+、-、或函数),总认为那种运算或函数),总认为那种运算对被运算数组中的每个元素(对被运算数组中的每个元素(Element)平)平等地实施同样的操作。等地实施同样的操作。l当两个数组具有相同阶数时,进行加、减、当两个数组具有相同阶数时,进行加、减、乘、除的乘、除的点运算,其运算是按元素对元素方点运算,其运算是按元素对元素方式进行的。式进行的。l例例 MatlabMatlab程序设计程序设计第三节第三节 矩阵运算矩阵运算l矩阵转置:转置符:矩阵转置:转置符:l矩阵的乘法矩阵的乘法l矩阵的相除矩阵的相除左除,

18、符号为左除,符号为/右除,符号为右除,符号为矩阵的乘方矩阵的乘方l当矩阵为方阵时,可进行指数乘法运算。当矩阵为方阵时,可进行指数乘法运算。 MatlabMatlab程序设计程序设计数组运算和矩阵运算的区别数组运算和矩阵运算的区别l从外观形状和数据结构上看,二维数组和(数从外观形状和数据结构上看,二维数组和(数学中的)矩阵没有区别。学中的)矩阵没有区别。l但是,矩阵作为一种变换或映射算子的体现,但是,矩阵作为一种变换或映射算子的体现,矩阵运算有着明确而严格的数学规则;数组运矩阵运算有着明确而严格的数学规则;数组运算是算是MATLAB软件所定义的规则,其目的是为软件所定义的规则,其目的是为了数据管

19、理方便、操作简单、指令形式自然和了数据管理方便、操作简单、指令形式自然和执行计算的有效。执行计算的有效。l虽然数组运算尚缺乏严谨的数学推理,数组运虽然数组运算尚缺乏严谨的数学推理,数组运算本身仍在完善和成熟中,但它的作用和影响算本身仍在完善和成熟中,但它的作用和影响正随着正随着MATLAB的发展而扩大。的发展而扩大。 MatlabMatlab程序设计程序设计数组运算和矩阵运算指令对照汇总(一)数组运算和矩阵运算指令对照汇总(一)数数 组组 运运 算算矩矩 阵阵 运运 算算指指 令令含含 义义指指 令令含含 义义A.非共轭转置。相当于非共轭转置。相当于conj(A)A共轭转置共轭转置A=s把标量

20、把标量s赋给赋给A的每个元素的每个元素s+B标量标量s分别与分别与B元素之和元素之和s-B,B-s标量标量s分别与分别与B的元素之差的元素之差s.*A标量标量s分别与分别与A的元素之积的元素之积s*A标量标量s分别与分别与A每个元素之积每个元素之积s./B,B.ss分别被分别被B的元素除的元素除s*inv(B)B阵的逆乘阵的逆乘sA.nA的每个元素自乘的每个元素自乘n次次AnA为方阵时,自乘为方阵时,自乘n次次A.p对对A的各元素分别求非整数的各元素分别求非整数幂幂Ap方阵方阵A的非整数乘方的非整数乘方p.A以以p为底,分别以为底,分别以A的元素的元素为指数求幂值为指数求幂值pAA阵为方阵时,

21、标量的矩阵阵为方阵时,标量的矩阵乘方乘方A+B对应元素相加对应元素相加A+B矩阵相加矩阵相加A-B对应元素相减对应元素相减A-B矩阵相减矩阵相减 MatlabMatlab程序设计程序设计数组运算和矩阵运算指令对照汇总(二)数组运算和矩阵运算指令对照汇总(二)数数 组组 运运 算算矩矩 阵阵 运运 算算指指 令令含含 义义指指 令令含含 义义A.*B对应元素相乘对应元素相乘A*B内维相同矩阵的乘积内维相同矩阵的乘积A./BA的元素被的元素被B的对应元素除的对应元素除A/BA右除右除BB.A(一定与上相同)(一定与上相同)BAA左除左除B(一般与右除不同)(一般与右除不同)exp(A)以自然数以自

22、然数e为底,分别以为底,分别以A的的元素为指数,求幂元素为指数,求幂expm(A)A的矩阵指数函数的矩阵指数函数log(A)对对A的各元素求对数的各元素求对数logm(A)A的矩阵对数函数的矩阵对数函数sqrt(A)对对A的各元素求平方根的各元素求平方根sqrtm(A)A的矩阵平方根函数的矩阵平方根函数f(A)求求A各个元素的函数值。各个元素的函数值。f(.)表示为上节所列各函数表示为上节所列各函数funm(A,FN)一般函数矩阵一般函数矩阵A#BA、B阵对应元素间的关系阵对应元素间的关系运算。运算。#代表关系运算符代表关系运算符ABA、B阵对应元素间的逻辑阵对应元素间的逻辑运算。运算。#代表

23、逻辑运算符代表逻辑运算符 MatlabMatlab程序设计程序设计复数矩阵复数矩阵l复数矩阵中的元素的虚数部分用复数矩阵中的元素的虚数部分用i和和j方式来输入,方式来输入,显示时只用显示时只用i方式表示。方式表示。l复数矩阵可以有两种方式表示:复数矩阵可以有两种方式表示:A=1 2;3 4+i*5 6;7 8A=1+5*i 2+6*I;3+7*i 4+8*il其显示结果是一样的。其显示结果是一样的。 MatlabMatlab程序设计程序设计特殊矩阵特殊矩阵(P42)l非数非数NaNl“空空”数组(空阵)数组(空阵)l全全0阵阵l单位阵单位阵l全全1阵阵l随机阵随机阵l其他特殊矩阵(表其他特殊矩

24、阵(表2-6) MatlabMatlab程序设计程序设计非数非数NaNl按按IEEE规定,规定,0/0,/,0等运算都会产生等运算都会产生非数非数(Not a Number)。该非数在)。该非数在MATLAB中用中用NaN或或nan记述。记述。l根据根据IEEE数学规范,数学规范,NaN具有以下具有以下性质性质:NaN参与运算所得的结果也是参与运算所得的结果也是NaN,即具有传递性;,即具有传递性;非数没有大小概念,因此不能比较两个非数的大小。非数没有大小概念,因此不能比较两个非数的大小。l非数的非数的功用功用:真实记述真实记述0/0,/,0运算的后果;运算的后果;避免可能因避免可能因0/0,

25、/,0运算而造成程序执行的中断;运算而造成程序执行的中断;在数据可视化中,用来裁剪图形。在数据可视化中,用来裁剪图形。算例算例 MatlabMatlab程序设计程序设计“空空”数组(空阵)数组(空阵)l“空空”数组数组是是MATLAB为操作和表述需要而专门设计的为操作和表述需要而专门设计的一种数组。一种数组。l某维长度为某维长度为0或若干维长度均为或若干维长度均为0的数组都是的数组都是“空空”数组。数组。l“空空”数组的数组的功用功用:在没有在没有“空空”数组参与的运算时,计算结果中的数组参与的运算时,计算结果中的“空空”可以合可以合理地解释理地解释“所得结果的含义所得结果的含义”;运用运用“

26、空空”数组对其他非空数组赋值,可以改变数组的大小,数组对其他非空数组赋值,可以改变数组的大小,但不能改变数组的维数。但不能改变数组的维数。l算例算例 MatlabMatlab程序设计程序设计第四节第四节 关系操作和逻辑操作关系操作和逻辑操作l在程序流控制和逻辑、模糊逻辑推理中,都需要对一类在程序流控制和逻辑、模糊逻辑推理中,都需要对一类是非问题作出是非问题作出“是真,是假是真,是假”的回答。为此的回答。为此MATLAB设设计了关系操作、逻辑操作计了关系操作、逻辑操作 和一些相关函数。和一些相关函数。lMATLAB的的约定约定:在所有关系表达式和逻辑表达式中,作为输入的任何非在所有关系表达式和逻

27、辑表达式中,作为输入的任何非0数都被数都被看作是看作是“逻辑真逻辑真”,而只有,而只有0才被认为是才被认为是“逻辑假逻辑假”。所有关系表达式和逻辑表达式的计算结果,即输出,是一个由所有关系表达式和逻辑表达式的计算结果,即输出,是一个由0和和1组成的组成的“逻辑数组(逻辑数组(Logical Array)”。在此数组中的。在此数组中的1表表示示“真真”,0表示表示“假假”。逻辑数组是一种特殊的数值数组。逻辑数组是一种特殊的数值数组。 MatlabMatlab程序设计程序设计关系操作和逻辑操作关系操作和逻辑操作l关系操作关系操作l逻辑操作逻辑操作 l关系、逻辑函数关系、逻辑函数 MatlabMat

28、lab程序设计程序设计关系操作关系操作指指 令令含含 义义指指 令令含含 义义小于小于=大于等于大于等于=小于等于小于等于=等于等于大于大于=不等于不等于说明说明l标量可以与任何维数组进行比较。比较在此标量与数组每个元素之间进行,因此比较标量可以与任何维数组进行比较。比较在此标量与数组每个元素之间进行,因此比较结果将与被比较数组同维。结果将与被比较数组同维。l当比较量中没有标量时,关系符两端进行比较的数组必须维数相同。比较在两数组相当比较量中没有标量时,关系符两端进行比较的数组必须维数相同。比较在两数组相同位置上的元素间进行,因此比较结果将与被比数组同维。同位置上的元素间进行,因此比较结果将与

29、被比数组同维。算例算例 MatlabMatlab程序设计程序设计逻辑操作逻辑操作指指 令令含含 义义指指 令令含含 义义指指 令令含含 义义与、和与、和|或或否、非否、非说明说明l标量可以与任何维数组进行逻辑运算。运算比较在标量与数组每个元素之间进行,因标量可以与任何维数组进行逻辑运算。运算比较在标量与数组每个元素之间进行,因此运算结果与参与运算的数组同维。此运算结果与参与运算的数组同维。l当逻辑运算中没有标量时,参与运算的数组必须维数相同。运算在两数组相同位置上当逻辑运算中没有标量时,参与运算的数组必须维数相同。运算在两数组相同位置上的元素间进行,因此运算结果数组必定和参与运算的数组同维。的

30、元素间进行,因此运算结果数组必定和参与运算的数组同维。算例算例 MatlabMatlab程序设计程序设计关系、逻辑函数关系、逻辑函数lMATLAB中能给出中能给出“逻辑数组逻辑数组”类型计算结果类型计算结果的函数有很多,包括:关系逻辑函数、工作状的函数有很多,包括:关系逻辑函数、工作状态判断函数、特殊数据判断函数、数据类型判态判断函数、特殊数据判断函数、数据类型判断函数等。断函数等。l关系逻辑函数关系逻辑函数l特殊数据判断指令特殊数据判断指令l数据类型判断指令数据类型判断指令 MatlabMatlab程序设计程序设计关系逻辑函数关系逻辑函数指指 令令含含 义义all(A)当向量当向量A的元素全

31、非的元素全非0时,结果才是时,结果才是1;否则结果是;否则结果是0any(A)只要向量只要向量A中有非中有非0元素,结果才是元素,结果才是1;否则结果是;否则结果是0isequal(A,B) A,B对应元素相等时,相应元素位置取对应元素相等时,相应元素位置取1;否则取;否则取0 xor(A,B)A,B对应元素同为对应元素同为0,或非,或非0时,相应元素位置取时,相应元素位置取0;否则取否则取1 MatlabMatlab程序设计程序设计特殊数据判断指令特殊数据判断指令指令指令含义含义指令指令含义含义isempty(x)x是空,则结果为是空,则结果为1isnan(x)对应对应x中非数中非数NaN元素的位置元素的位置取取1,其余均为,其余均为0isfinite(x)对应对应x中有限大小元素的位置中有限大小元素的位置取取1,其余均为,其余均为0isprime(x)对应对应x中质数元素的位置取中质数元素的位置取1,其余均为其余均为0isinf(x)对应对应x

温馨提示

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

评论

0/150

提交评论