MATLAB设计矩阵计算器要点.docx
《MATLAB设计矩阵计算器要点.docx》由会员分享,可在线阅读,更多相关《MATLAB设计矩阵计算器要点.docx(23页珍藏版)》请在冰豆网上搜索。
MATLAB设计矩阵计算器要点
MATLAB程序设计语言大作业
——矩阵计算器
题目:
矩阵计算器
学号:
02123010
姓名:
石星宇
指导教师:
汤建龙
1、实验目的
1、通过GUI(GraphicalUserInterface,简称GUI,图形用户界面,又称图形用户接口)设计矩阵计算器,熟悉MATLAB中GUI工具的使用和编程。
2、加深对MATLABGUI中句柄控制变量的理解。
3、巩固线性代数中矩阵的基本运算。
2、实验内容
1、利用MATLAB中的GUIDE工具箱快速生成GUI界面。
2、在生成的GUI界面中设计能够实现矩阵基本运算的矩阵计算器。
3、实验结果
通过GUIDE快速生成GUI界面设计的矩阵计算器如下图所示:
图1MatrixCalculator基本界面
该矩阵计算器包含四模块,分别为:
输入区、输出区、功能区及其他运算区。
4、功能描述
1、功能概述
本矩阵计算器能够实现一些基本的矩阵运算,包括对单个矩阵的运算以及对两个矩阵的运算。
其中,对于两个矩阵的运算有:
加、减、乘、除(左除、右除)、按元素乘、按元素除以及求解线性方程组;对于単个矩阵的运算有:
转置(共轭与非共轭)、求逆、计算行列式、求秩、平方、立方、开方、求特征值、求2范数、LU分解、最简阶梯阵化简等。
计算过程中,矩阵的输入方式与MATLAB中矩阵输入方式类似。
即①矩阵行中的元素以空格或逗号间隔;②矩阵行之间以分号间隔;③整个元素列表用方括号括起来。
2、功能详细描述
2.1矩阵相加(减)
输入A=[123;456;789],B=[147;258;369],按下“+”按钮,输出区显示计算结果如图2所示:
图2矩阵相加
输入的A、B矩阵必须是维数相同,否则不能实现相加运算。
如输入不同维数的矩阵且进行相加运算,则会提示出错如图3所示:
图3矩阵相加错误提示
两矩阵相减的运算过程与相加运算类似,在此不再赘述。
2.2矩阵相乘
输入A=[123;456;789],B=[147;852;396],按下“*”按钮,输出区显示计算结果如图4所示:
图4矩阵相乘
输入的A、B矩阵必须满足前者的列数等于后者的行数,否则不能实现矩阵的乘法运算,出现错误提示如图5所示:
图5矩阵相乘错误提示
2.3按元素乘(除)
输入同2.2。
按下“.*”按钮,输出区显示计算结果如图6所示:
图6矩阵按元素相乘
输入的A、B矩阵必须是维数相同,否则不能实现按元素乘的运算。
如输入不同维数的矩阵且进行按元素乘的运算,则会提示出错,提示信息同图3。
2.4矩阵左(右)除
输入A=[12;35],B=[12;57],按下“/L”按钮,输出区显示计算结果如图7所示:
图7矩阵左除
输入的A、B矩阵必须满足行相等,否则出现错误提示如图8所示:
图8矩阵左除错误提示
2.5矩阵转置(共轭与非共轭)
输入A=[2+
5;3,7-8
],按下“A’”(共轭转置)与“A.’”按钮(非共轭转置),输出区分别显示计算结果如图9所示:
图9共轭转置(上)与非共轭转置(下)
2.6行列式计算
输入A=[124;456;789],按下“det”按钮,输出区显示计算结果如图10所示:
图10方阵求行列式
输入矩阵A必须为方阵,否则无法计算行列式,提示错误如图11所示:
图11求行列式错误提示
2.7矩阵求逆
输入A=[124;456;258],按下“inv”按钮,输出区显示计算结果如图12所示:
图12矩阵求逆
本矩阵计算器求逆功能只针对非奇异方阵,如果输入矩阵A为奇异阵或非方阵,均会提示错误,具体见图13、图14:
图13输入为非方阵时的错误提示
图14输入为奇异阵时的错误提示
2.8线性方程组求解
输入A=[123;2-53;3-25](系数矩阵),B=[0;5;9](常数项),按下“Ax=B”按钮,输出区显示计算结果如图15所示:
图15线性方程组求解
本部分输入限制较大,须详细说明。
第一,系数矩阵必须是非奇异的方阵,否则方程组解不存在或不唯一,本计算器无法求解。
第二,常数项必须与系数矩阵行数相同,否则也会出现错误提示。
2.9矩阵求秩与最简行阶梯阵化简
输入矩阵A=[123;456;456],分别按下“R”、“rref”按钮,输出区显示计算结果如图16所示:
最简行阶梯阵
矩阵的秩
图16矩阵求秩与最简行阶梯阵化简
2.10平方、立方、与开方运算
输入矩阵A=[123;456;789],分别按下“^2”、“^3”、“Sqrt”按钮,输出区显示计算结果如图17所示:
图17矩阵平方、立方、与开方运算
2.11矩阵特征值
输入矩阵A=[123;456;789],按下“eig”按钮,输出区显示计算结果如图18所示:
图18矩阵特征值求解
2.12LU分解
输入矩阵A=[123;456;426],按下“LU”按钮,输出区显示计算结果如图19所示:
图19矩阵LU分解
其中输出区前三行为矩阵L,后三行为矩阵U,即:
L=
0.2500-0.25001.0000
1.000000
1.00001.00000
U=
4.00005.00006.0000
0-3.00000
001.5000
A=L*U.
2.13求矩阵范数
输入矩阵A=[123;456;426],按下“Norm”按钮,输出区显示计算结果如图20所示:
图20求矩阵范数
由于设计者能力有限,本计算器默认计算矩阵的2范数,其他范数暂不能计算。
2.14其他运算
设计本部分的目的在于实现功能区中无法一步实现的计算。
比如两矩阵的线性组合(
,其中
均为常数)、矩阵的高次幂(
)等。
具体用法见图21:
图21其他矩阵运算
实现
运算
实现
运算
图21其他矩阵运算
(2)
利用“其他运算”模块对一个矩阵进行操作时,另一个矩阵不能没有输入,因此,假设在操作A矩阵(
),此时B矩阵仍要赋值为空([]),如图所示:
否则无法进行计算。
附录(主要代码):
%%作者:
石星宇
%%设计时间:
2014年4月26日
%%设计目的:
通过GUI设计矩阵计算器,熟悉MATLAB中GUI工具的使用和编程。
%%加深对MATLABGUI中句柄控制变量的理解。
%%巩固线性代数中矩阵的基本运算。
%%功能简介:
实现一些基本的矩阵运算,包括对单个矩阵的运算以及对两个矩阵的运算。
其中,对于两个矩阵的运算有:
加、减、乘、除(左除、右除)、按元素乘、按元素除以及求解线性方程组;对于単个矩阵的运算有:
转置(共轭与非共轭)、求逆、计算行列式、求秩、平方、立方、开方、求特征值、求2范数、LU分解、最简阶梯阵化简等。
functionvarargout=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',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
functionMatrix_Calculator_OpeningFcn(hObject,eventdata,handles,varargin)
handles.output=hObject;
guidata(hObject,handles);
functionvarargout=Matrix_Calculator_OutputFcn(hObject,eventdata,handles)
varargout{1}=handles.output;
functionMatrix_A_Callback(hObject,eventdata,handles)
functionMatrix_A_CreateFcn(hObject,eventdata,handles)
ifispc&&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
End
functionMatrix_B_Callback(hObject,eventdata,handles)
functionMatrix_B_CreateFcn(hObject,eventdata,handles)
ifispc&&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
functionadd_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
B=eval((get(handles.Matrix_B,'String')));
[iAjA]=size(A);
[iBjB]=size(B);
ifiA~=iB|jA~=jB|(iA~=iB&jA~=jB)%判断A、B是否满足相加条件
R='error.Matrixdimensionsmustagree.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
result=A+B;
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
end
functionsubtract_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
B=eval((get(handles.Matrix_B,'String')));
[iAjA]=size(A);
[iBjB]=size(B);
ifiA~=iB|jA~=jB|(iA~=iB&jA~=jB)%判断A、B是否满足相减条件
R='error.Matrixdimensionsmustagree.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
result=A-B;
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
end
functiontimes_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
B=eval((get(handles.Matrix_B,'String')));
[iAjA]=size(A);
[iBjB]=size(B);
ifjA~=iB%判断A、B是否满足相乘条件
R='error.Innermatrixdimensionsmustagree.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
result=A*B;
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
end
functionL_divide_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
B=eval((get(handles.Matrix_B,'String')));
[iAjA]=size(A);
[iBjB]=size(B);
ifiA~=iB%判断A、B是否满足左除条件
R='error.Matrixdimensionsmustagree.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
result=A\B;
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
end
functionR_divide_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
B=eval((get(handles.Matrix_B,'String')));
[iAjA]=size(A);
[iBjB]=size(B);
ifiA~=iB%判断A、B是否满足右除条件
R='error.Matrixdimensionsmustagree.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
result=A/B;
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
end
functiontransposition_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
result=A';
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
functiondeterminant_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
[iAjA]=size(A);
ifiA~=jA%判断A是否为方阵
R='error.Matrixmustbesquare.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
result=det(A);
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
end
functioninvertor_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
[iAjA]=size(A);
ifiA~=jA%判断A是否为方阵
R='error.Matrixmustbesquare.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
ifdet(A)==0%判断A是否为奇异阵
R='error.Matrixissingulartoworkingprecision.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
result=inv(A);
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
end
end
functionrank_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
result=rank(A);
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
functionsquare_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
[iAjA]=size(A);
ifiA~=jA%判断A是否为方阵
R='error.Inputsmustbeascalarandasquarematrix.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
result=A^2;
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
end
functioncube_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
[iAjA]=size(A);
ifiA~=jA%判断A是否为方阵
R='error.Inputsmustbeascalarandasquarematrix.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
result=A^3;
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
end
functiontimes2_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);
functiondivede2_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);
functiontransposition2_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
result=A.';
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
functioneigenvalue_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
[iAjA]=size(A);
ifiA~=jA%判断A是否为方阵
R='error.Matrixmustbesquare.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
result=eig(A);
R=num2str(result);
set(handles.Answer,'String',R)
guidata(hObject,handles);
end
functionsolve_Callback(hObject,eventdata,handles)
A=eval((get(handles.Matrix_A,'String')));
B=eval((get(handles.Matrix_B,'String')));
[iAjA]=size(A);
[iBjB]=size(B);
ifiA~=iB
R='error.';
set(handles.Answer,'String',R)
guidata(hObject,handles);
else
ifiA~=jA%判断A是否为方阵
R='error.Matrixmustbesquare.';
set(handles.Answer,'String',