admin 管理员组文章数量: 1086019
2024年3月11日发(作者:bottom是啥)
数学应用软件工具箱开发
——矩阵计算器
姓 名: ***
学 号:********
指导老师: ***
专 业:********
2014年9月11日
一.操作过程
1.准备工作
①在Matlab的主窗口中,选择File菜单中的New菜单项,再选择其中的GUI命令,
就会显示GUI的设计模板;
②选择GUI模板中的默认的空白模版Blank GUI(Default)就会显示GUI设计窗口,
可以开始设计矩阵计算器了。
2.设计过程
①在GUI界面中加入以下控件:
1>2个文本编辑器(edit text)作为输入矩阵的窗口;
2>16个用以执行运算的按钮(push button);
3>4个静态文本框(static text),其中一个作为显示计算所得结果的窗口,另外3个
分别作为表示所输入的矩阵(A、B)以及用来输入标题(矩阵计算器);
4>加入3个按钮组(button group)分别圈住:
a.1>中的2个控件及3>中的A、B;
b.2>中的16个计算按钮;
c.3>中的显示计算结果的窗口。
②分别双击以上25个控件修改其string属性如下:
1>
2>
3>
4>
中的改为空白(将原有的“edit text”删掉);
中的改为对应的矩阵运算或文字,如“+”、“/R”、“秩”、“逆”等(见图1);
中的按顺序改为空白、“A”、“B”以及“矩阵计算器”;
中的按钮组分别改为“输入区”、“功能区”、“输出区”。
③对每个控件分别单击右键,选择“view callback”→“callback” →“保存”,在
每个控件的函数后加入代码(见附件)。
④此外,还需要做的小变动有:
1>②中修改string属性时通过修改fontWeight及fontSize把string的字符粗细、
字号也一并修改了。
2>分别双击2个文本编辑器(edit text)将其max属性取值为100或更大的值,以使
1
编辑器有滚动条,方便显示输入的维数比较大的矩阵。
3>双击计算结果窗口将其style改为listbox,也用于显示维数比较大的计算结果。
4>还可修改各控件的backgroundcolor(背景色) 、HorizontalAligment(对齐方式)
等其他属性以美化界面。
⑤保存运行的结果如下:
图1
二.功能简介
1.功能概述
此矩阵计算器能够实现一些基本的矩阵运算,包括对单个矩阵的运算以及对两个矩阵
的运算。
其中,对于两个矩阵的运算有:加、减、乘、除(左除、右除)、按元素乘、按元素除
以及求解线性方程组;对于単个矩阵的运算有:转置、求秩、求逆、计算行列式、求2范
2
数、LU分解、最简阶梯阵化简、求特征值等。
计算过程中,矩阵的输入方式有两种:
1>与MATLAB中矩阵输入方式类似,即:矩阵行中的元素以空格或逗号间隔;矩阵
行之间以分号间隔;整个元素列表用方括号括起来。
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
3
输入的A、B矩阵必须是维数相同,否则不能实现相加运算。如输入不同维数的矩阵
且进行相加运算,则会提示出错,如图3所示:
图3
两矩阵相减的运算过程与相加运算类似,在此不再赘述。
2> 点乘(除)
输入A=[1 2 3;4 5 6;7 8 9],B=[1 4 7;2 5 8;3 6 9],按下“.*”按钮,输出区显示计
算结果如图4所示:
图4
4
输入的A、B矩阵必须是维数相同,否则不能实现按元素乘(除)的运算。如输入不
同维数的矩阵且进行按元素乘的运算,则会提示出错,提示信息同图3。
3> 矩阵相乘:
输入A=[1 2 3;4 5 6;7 8 9],B=[1 4 7;2 5 8;3 6 9],按下“*”按钮,输出区显示计
算结果如图5所示:
图5
输入的A、B矩阵必须满足前者的列数等于后者的行数,否则不能实现矩阵的乘法运
算,出现错误提示如图6所示:
图6
5
4> 左除(右除):
输入A=[1 2 3;4 5 6;7 8 9],B=[1 4 7;2 5 8;3 6 9],按下“/L”按钮,输出区显示计
算结果如图7所示:
图7
输入的A、B矩阵必须满足行相等,否则出现错误提示如图8所示:
图8
5> 矩阵转置:
6
输入矩阵A=[1 2 3;4 5 6;7 8 9],点击“A’”按钮,显示结果如图9所示:
图9
6> 矩阵求秩:
输入矩阵A=[1 2 3;4 5 6;7 8 9],点击“秩”按钮,输出区显示计算结果如图10所示:
图10
7
7> 矩阵求逆:
输入矩阵A=[1 2 4;4 5 6;7 8 9],按下“逆”按钮,输出区显示计算结果如图11所示:
图11
本矩阵计算器求逆功能只针对非奇异方阵,如果输入矩阵A为奇异阵或非方阵,均会
提示错误
A为非方阵时提示错误如图12:
8
图12
A为奇异阵时提示错误如图13:
图13
8> 行列式:
输入A=[1 2 4;4 5 6;7 8 9],按下“行列式”按钮,输出区显示计算结果如图14所示:
9
图14
输入矩阵A必须为方阵,否则无法计算行列式,提示错误如图15所示:
图15
9> 范数:
输入矩阵A=[1 2 3;4 5 6;7 8 9],按下“范数”按钮,输出区显示计算结果如16所示:
10
图16
由于设计者能力有限,本计算器默认计算矩阵的2范数,其他范数暂不能计算。
10> LU分解:
输入矩阵A=[1 2 3;4 5 6;4 2 6],按下“LU”按钮,输出区显示计算结果如图17所
示:
11
图17
其中,输出前三行为L矩阵,中间三行为U矩阵,后三行为P矩阵
11> 线性方程组求解:AX=B
输入A=[1 2 3;4 5 6;7 8 9](系数矩阵),B=[4;5;6](常数项),按下“Ax=B”按钮,
输出区显示计算结果图18所示:
12
图18
本部分输入限制较大,须详细说明。第一,系数矩阵必须是非奇异的方阵,否则方程
组解不存在或不唯一,本计算器无法求解。第二,常数项必须与系数矩阵行数相同,否则
也会出现错误提示
12> 最简行阶梯形矩阵:
输入矩阵A=[1 2 3;4 5 6;7 8 9],分别按下“阶梯形”按钮,输出区显示计算结果如
图19所示:
13
图19
13> 特征值:
输入矩阵A=[1 2 3;4 5 6;7 8 9],按下“特征值”按钮,输出区显示计算结果如图20
所示:
图20
14
附录:主要代码
%%矩阵相加
a=str2num(get(1,'string'));
b=str2num(get(2,'string'));
[ia ja]=size(a);
[ib jb]=size(b);
if ia ~= ib | ja ~= jb |(ia ~= ib & ja ~= jb)%判断A、
c=' dimensions must agree.';
set(1,'String',c)
guidata(hObject, handles);
else
result = a+b ;
c= num2str(result);
15
B是否满足相加条件
set(1,'String',c)
guidata(hObject, handles);
end
%%矩阵相减
a=str2num(get(1,'string'));
b=str2num(get(2,'string'));
[ia ja]=size(a);
[ib jb]=size(b);
if ia ~= ib | ja ~= jb |(ia ~= ib & ja ~= jb)%判断A、
c=' dimensions must agree.';
set(1,'String',c)
guidata(hObject, handles);
else
16
B是否满足相减条件
result = a-b ;
c= num2str(result);
set(1,'String',c)
guidata(hObject, handles);
end
%%矩阵点乘
a=str2num(get(1,'string'));
b=str2num(get(2,'string'));
[ia ja]=size(a);
[ib jb]=size(b);
if ia ~= ib | ja ~= jb |(ia ~= ib & ja ~= jb)%判断A、
c=' dimensions must agree.';
set(1,'String',c)
17
B是否满足点乘条件
guidata(hObject, handles);
else
result = a.*b ;
c= num2str(result);
set(1,'String',c)
guidata(hObject, handles);
end
%%矩阵相乘
a=str2num(get(1,'string'));
b=str2num(get(2,'string'));
[ia ja]=size(a);
[ib jb]=size(b);
if ja ~= ib %判断A、B是否满足相乘条件
18
c=' matrix dimensions must agree.';
set(1,'String',c)
guidata(hObject, handles);
else
result = a*b ;
c= num2str(result);
set(1,'String',c)
guidata(hObject, handles);
end
%%矩阵点除
a=str2num(get(1,'string'));
b=str2num(get(2,'string'));
[ia ja]=size(a);
19
[ib jb]=size(b);
if ia ~= ib | ja ~= jb |(ia ~= ib & ja ~= jb)%判断A、B是否满足点除条件
c=' dimensions must agree.';
set(1,'String',c)
guidata(hObject, handles);
else
result = a./b ;
c= num2str(result);
set(1,'String',c)
guidata(hObject, handles);
end
%%矩阵左除
a=str2num(get(1,'string'));
20
b=str2num(get(2,'string'));
[ia ja]=size(a);
[ib jb]=size(b);
if ia ~= ib %判断A、B是否满足左除条件
c=' dimensions must agree.';
set(1,'String',c)
guidata(hObject, handles);
else
result = ab ;
c= num2str(result);
set(1,'String',c)
guidata(hObject, handles);
end
21
%%矩阵右除
a=str2num(get(1,'string'));
b=str2num(get(2,'string'));
[ia ja]=size(a);
[ib jb]=size(b);
if ia ~= ib %判断A、B是否满足右除条件
c=' dimensions must agree.';
set(1,'String',c)
guidata(hObject, handles);
else
result = a/b ;
c= num2str(result);
set(1,'String',c)
22
guidata(hObject, handles);
end
%%矩阵求秩
a=str2num(get(1,'string'));
c=a';
set(1,'string',num2str(c))
a=str2num(get(1,'string'));
result =rank(a) ;
c= num2str(result);
set(1,'String',c)
guidata(hObject, handles);
%%求逆
a=str2num(get(1,'string'));
23
[ia ja]=size(a);
if ia~= ja %判断A是否为方阵
c=' dimensions must agree.';
set(1,'String',c)
guidata(hObject, handles);
else
if abs(det(a))<1e-6 %判断A是否为奇异阵
c=' is singular to working precision.';
set(1,'String',c)
guidata(hObject, handles);
else
result = inv(a) ;
c = num2str(result);
24
set(1,'String',c)
guidata(hObject, handles);
end
end
%%求行列式
a=str2num(get(1,'string'));
[ia ja]=size(a);
if ia ~= ja %判断A是否为方阵
c=' dimensions must agree.';
set(1,'String',c)
guidata(hObject, handles);
else
result = det(a) ;
25
c= num2str(result);
set(1,'String',c)
guidata(hObject, handles);
end
%%求2-范数
a=str2num(get(1,'string'));
result = norm(a);
c = num2str(result);
set(1,'String',c)
guidata(hObject, handles)
%%求LU分解
a=str2num(get(1,'string'));
[L,U,P]=lu(a);
26
result = [L;U;P] ;
c= num2str(result);
set(1,'String',c)
guidata(hObject, handles)
%%求AX=B
a=str2num(get(1,'string'));
b=str2num(get(2,'string'));
[ia ja]=size(a);
[ib jb]=size(b);
if ia ~= ib
c='error.';
set(1,'String',c)
guidata(hObject, handles);
27
else
if ia ~=ja %判断A是否为方阵
c=' must be square.';
set(1,'String',c)
guidata(hObject, handles);
else
if det(a) == 0 %判断A是否为奇异阵
c=' is singular to working precision.';
set(1,'String',c)
guidata(hObject, handles);
else
result = ab ;
c = num2str(result);
28
set(1,'String',c)
guidata(hObject, handles);
end
end
end
a=str2num(get(1,'string'));
result = rref(a);
c= num2str(result);
set(1,'String',c)
guidata(hObject, handles);
%%求特征值
a=str2num(get(1,'string'));
[ia ja]=size(a);
29
if ia ~= ja %判断A是否为方阵
c=' must be square .';
set(1,'String',c)
guidata(hObject, handles);
else
result = eig(a) ;
c= num2str(result);
set(1,'String',c)
guidata(hObject, handles);
end
30
31
版权声明:本文标题:matlab-GUI矩阵计算器 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1710096600a557529.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论