1、MATLAB设计矩阵计算器要点MATLAB程序设计语言大作业矩阵计算器题 目:矩阵计算器学 号:02123010姓 名:石星宇指导教师:汤建龙1、实验目的1、通过GUI(Graphical User Interface,简称GUI,图形用户界面,又称图形用户接口)设计矩阵计算器,熟悉MATLAB中GUI工具的使用和编程。2、加深对MATLAB GUI中句柄控制变量的理解。3、巩固线性代数中矩阵的基本运算。2、实验内容1、利用MATLAB中的GUIDE工具箱快速生成GUI界面。2、在生成的GUI界面中设计能够实现矩阵基本运算的矩阵计算器。3、实验结果通过GUIDE快速生成GUI界面设计的矩阵计算
2、器如下图所示:图1 Matrix Calculator基本界面该矩阵计算器包含四模块,分别为:输入区、输出区、功能区及其他运算区。4、功能描述1、功能概述本矩阵计算器能够实现一些基本的矩阵运算,包括对单个矩阵的运算以及对两个矩阵的运算。其中,对于两个矩阵的运算有:加、减、乘、除(左除、右除)、按元素乘、按元素除以及求解线性方程组;对于単个矩阵的运算有:转置(共轭与非共轭)、求逆、计算行列式、求秩、平方、立方、开方、求特征值、求2范数、LU分解、最简阶梯阵化简等。计算过程中,矩阵的输入方式与MATLAB中矩阵输入方式类似。即矩阵行中的元素以空格或逗号间隔;矩阵行之间以分号间隔;整个元素列表用方括
3、号括起来。2、功能详细描述2.1矩阵相加(减)输入A=1 2 3;4 5 6;7 8 9,B=1 4 7;2 5 8;3 6 9,按下“+”按钮,输出区显示计算结果如图2所示:图2 矩阵相加输入的A、B矩阵必须是维数相同,否则不能实现相加运算。如输入不同维数的矩阵且进行相加运算,则会提示出错如图3所示:图3 矩阵相加错误提示两矩阵相减的运算过程与相加运算类似,在此不再赘述。2.2矩阵相乘输入A=1 2 3;4 5 6;7 8 9,B=1 4 7;8 5 2;3 9 6,按下“*”按钮,输出区显示计算结果如图4所示:图4 矩阵相乘输入的A、B矩阵必须满足前者的列数等于后者的行数,否则不能实现矩阵
4、的乘法运算,出现错误提示如图5所示:图5 矩阵相乘错误提示2.3按元素乘(除)输入同2.2。按下“.*”按钮,输出区显示计算结果如图6所示:图6 矩阵按元素相乘输入的A、B矩阵必须是维数相同,否则不能实现按元素乘的运算。如输入不同维数的矩阵且进行按元素乘的运算,则会提示出错,提示信息同图3。2.4矩阵左(右)除输入A=1 2;3 5,B=1 2;5 7,按下“/L”按钮,输出区显示计算结果如图7所示:图7 矩阵左除输入的A、B矩阵必须满足行相等,否则出现错误提示如图8所示:图8 矩阵左除错误提示2.5矩阵转置(共轭与非共轭)输入A=2+,5;3,7-8,按下“A”(共轭转置)与“A.”按钮(非
5、共轭转置),输出区分别显示计算结果如图9所示:图9 共轭转置(上)与非共轭转置(下)2.6行列式计算输入A=1 2 4;4 5 6;7 8 9,按下“det”按钮,输出区显示计算结果如图10所示:图10 方阵求行列式输入矩阵A必须为方阵,否则无法计算行列式,提示错误如图11所示:图11 求行列式 错误提示2.7矩阵求逆输入A=1 2 4;4 5 6;2 5 8,按下“inv”按钮,输出区显示计算结果如图12所示:图12 矩阵求逆本矩阵计算器求逆功能只针对非奇异方阵,如果输入矩阵A为奇异阵或非方阵,均会提示错误,具体见图13、图14:图13 输入为非方阵时的错误提示图14 输入为奇异阵时的错误提
6、示2.8线性方程组求解输入A=1 2 3 ; 2 -5 3;3 -2 5 (系数矩阵),B=0 ; 5 ;9(常数项),按下“Ax=B”按钮,输出区显示计算结果如图15所示:图15 线性方程组求解本部分输入限制较大,须详细说明。第一,系数矩阵必须是非奇异的方阵,否则方程组解不存在或不唯一,本计算器无法求解。第二,常数项必须与系数矩阵行数相同,否则也会出现错误提示。2.9矩阵求秩与最简行阶梯阵化简输入矩阵A=1 2 3;4 5 6;4 5 6,分别按下“R”、“rref”按钮,输出区显示计算结果如图16所示:最简行阶梯阵矩阵的秩图16 矩阵求秩与最简行阶梯阵化简 2.10平方、立方、与开方运算输
7、入矩阵A=1 2 3;4 5 6;7 8 9,分别按下“2”、“3”、“Sqrt”按钮,输出区显示计算结果如图17所示:图17 矩阵平方、立方、与开方运算2.11矩阵特征值输入矩阵A=1 2 3;4 5 6;7 8 9,按下“eig”按钮,输出区显示计算结果如图18所示:图18 矩阵特征值求解2.12 LU分解输入矩阵A=1 2 3;4 5 6;4 2 6,按下“LU”按钮,输出区显示计算结果如图19所示:图19 矩阵LU分解其中输出区前三行为矩阵L,后三行为矩阵U,即:L = 0.2500 -0.2500 1.0000 1.0000 0 0 1.0000 1.0000 0U = 4.0000
8、 5.0000 6.0000 0 -3.0000 0 0 0 1.5000A=L*U.2.13求矩阵范数输入矩阵A=1 2 3;4 5 6;4 2 6,按下“Norm”按钮,输出区显示计算结果如图20所示:图20 求矩阵范数由于设计者能力有限,本计算器默认计算矩阵的2范数,其他范数暂不能计算。2.14其他运算设计本部分的目的在于实现功能区中无法一步实现的计算。比如两矩阵的线性组合(,其中均为常数)、矩阵的高次幂()等。具体用法见图21:图21 其他矩阵运算实现运算实现运算图21 其他矩阵运算(2)利用“其他运算”模块对一个矩阵进行操作时,另一个矩阵不能没有输入,因此,假设在操作A矩阵(),此时
9、B矩阵仍要赋值为空(),如图所示: 否则无法进行计算。附录(主要代码):%作者:石星宇%设计时间:2014年4月26日%设计目的:通过GUI设计矩阵计算器,熟悉MATLAB中GUI工具的使用和编程。% 加深对MATLAB GUI中句柄控制变量的理解。% 巩固线性代数中矩阵的基本运算。%功能简介:实现一些基本的矩阵运算,包括对单个矩阵的运算以及对两个矩阵的运算。其中,对于两个矩阵的运算有:加、减、乘、除(左除、右除)、按元素乘、按元素除以及求解线性方程组;对于単个矩阵的运算有:转置(共轭与非共轭)、求逆、计算行列式、求秩、平方、立方、开方、求特征值、求2范数、LU分解、最简阶梯阵化简等。func
10、tion varargout = Matrix_Calculator(varargin)gui_Singleton = 1;gui_State = struct(gui_Name, mfilename, . gui_Singleton, gui_Singleton, . gui_OpeningFcn, Matrix_Calculator_OpeningFcn, . gui_OutputFcn, Matrix_Calculator_OutputFcn, . gui_LayoutFcn, , . gui_Callback, );if nargin & ischar(varargin1) gui_S
11、tate.gui_Callback = str2func(varargin1);end if nargout varargout1:nargout = gui_mainfcn(gui_State, varargin:);else gui_mainfcn(gui_State, varargin:);endfunction Matrix_Calculator_OpeningFcn(hObject, eventdata, handles, varargin)handles.output = hObject;guidata(hObject, handles);function varargout =
12、Matrix_Calculator_OutputFcn(hObject, eventdata, handles)varargout1 = handles.output;function Matrix_A_Callback(hObject, eventdata, handles)function Matrix_A_CreateFcn(hObject, eventdata, handles)if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,Backgr
13、oundColor,white);Endfunction Matrix_B_Callback(hObject, eventdata, handles)function Matrix_B_CreateFcn(hObject, eventdata, handles)if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white);endfunction add_Callback(hObject, eventdata, ha
14、ndles)A = eval(get(handles.Matrix_A,String);B = eval(get(handles.Matrix_B,String);iA jA=size(A);iB jB=size(B);if iA = iB | jA = jB |(iA = iB & jA = jB)%判断A、B是否满足相加条件 R=error.Matrix dimensions must agree.; set(handles.Answer,String,R) guidata(hObject, handles);else result = A + B ; R = num2str(result
15、); set(handles.Answer,String,R) guidata(hObject, handles);endfunction subtract_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);B = eval(get(handles.Matrix_B,String);iA jA=size(A);iB jB=size(B);if iA = iB | jA = jB |(iA = iB & jA = jB)%判断A、B是否满足相减条件 R=error.Matrix dimension
16、s must agree.; set(handles.Answer,String,R) guidata(hObject, handles);else result = A - B ; R = num2str(result); set(handles.Answer,String,R) guidata(hObject, handles);endfunction times_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);B = eval(get(handles.Matrix_B,String);i
17、A jA=size(A);iB jB=size(B);if jA=iB %判断A、B是否满足相乘条件 R=error.Inner matrix dimensions must agree.; set(handles.Answer,String,R) guidata(hObject, handles);else result = A * B ; R = num2str(result); set(handles.Answer,String,R) guidata(hObject, handles);end function L_divide_Callback(hObject, eventdata,
18、handles)A = eval(get(handles.Matrix_A,String);B = eval(get(handles.Matrix_B,String);iA jA=size(A);iB jB=size(B);if iA=iB %判断A、B是否满足左除条件 R=error.Matrix dimensions must agree.; set(handles.Answer,String,R) guidata(hObject, handles);else result = A B ; R = num2str(result); set(handles.Answer,String,R)
19、guidata(hObject, handles);endfunction R_divide_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);B = eval(get(handles.Matrix_B,String);iA jA=size(A);iB jB=size(B);if iA=iB %判断A、B是否满足右除条件 R=error.Matrix dimensions must agree.; set(handles.Answer,String,R) guidata(hObject, han
20、dles);else result = A / B ; R = num2str(result); set(handles.Answer,String,R) guidata(hObject, handles);endfunction transposition_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);result = A ;R = num2str(result);set(handles.Answer,String,R)guidata(hObject, handles);function
21、determinant_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);iA jA=size(A);if iA =jA %判断A是否为方阵 R=error.Matrix must be square.; set(handles.Answer,String,R) guidata(hObject, handles);else result = det(A) ; R = num2str(result); set(handles.Answer,String,R) guidata(hObject, ha
22、ndles);end function invertor_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);iA jA=size(A);if iA =jA %判断A是否为方阵 R=error.Matrix must be square.; set(handles.Answer,String,R) guidata(hObject, handles);else if det(A) = 0 %判断A是否为奇异阵 R=error.Matrix is singular to working precisi
23、on.; set(handles.Answer,String,R) guidata(hObject, handles); else result = inv(A) ; R = num2str(result); set(handles.Answer,String,R) guidata(hObject, handles); endendfunction rank_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);result = rank(A) ;R = num2str(result);set(ha
24、ndles.Answer,String,R)guidata(hObject, handles); function square_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);iA jA=size(A);if iA =jA %判断A是否为方阵 R=error.Inputs must be a scalar and a square matrix.; set(handles.Answer,String,R) guidata(hObject, handles);else result = A2
25、; R = num2str(result); set(handles.Answer,String,R) guidata(hObject, handles);end function cube_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);iA jA=size(A);if iA =jA %判断A是否为方阵 R=error.Inputs must be a scalar and a square matrix.; set(handles.Answer,String,R) guidata(hObj
26、ect, handles);else result = A3 ; R = num2str(result); set(handles.Answer,String,R) guidata(hObject, handles);endfunction times2_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);B = eval(get(handles.Matrix_B,String);result = A .* B ;R = num2str(result);set(handles.Answer,Str
27、ing,R)guidata(hObject, handles);function divede2_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);B = eval(get(handles.Matrix_B,String);result = A ./ B ;R = num2str(result);set(handles.Answer,String,R)guidata(hObject, handles); function transposition2_Callback(hObject, even
28、tdata, handles)A = eval(get(handles.Matrix_A,String);result = A. ;R = num2str(result);set(handles.Answer,String,R)guidata(hObject, handles); function eigenvalue_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);iA jA=size(A);if iA =jA %判断A是否为方阵 R=error.Matrix must be square.
29、; set(handles.Answer,String,R) guidata(hObject, handles);else result = eig(A) ; R = num2str(result); set(handles.Answer,String,R) guidata(hObject, handles);endfunction solve_Callback(hObject, eventdata, handles)A = eval(get(handles.Matrix_A,String);B = eval(get(handles.Matrix_B,String);iA jA=size(A);iB jB=size(B);if iA = iB R=error.; set(handles.Answer,String,R) guidata(hObject, handles);else if iA =jA %判断A是否为方阵 R=error.Matrix must be square.; set(handles.Answer,String,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1