4、使用函数,实现矩阵左旋90°或右旋90°的功能
解:
A=[2310-780;41-45655;325032;6-549214]
rot90(A)
rot90(A,3)
5、写出使以下这段文字成为字符串的MATLAB指令。
注意保持这段文字的格式:
在英式用法中,引号通常是单引号,如'Fire!
'。
InGBusagequotationmarksareusuallysingle:
'fire!
'.
解:
a=['在英式用法中,引号通常是单引号,如''Fire!
''。
'];
b=['InGBusagequotationmarksareusuallysingle:
''fire!
''.'];
c=strvcat(a,b)
6、用结构体数组来存储2名学生的基本情况数据,每名学生的数据包括学号、姓名、专业和2门课程的成绩。
解:
clear,clc
xuesheng=struct('num',{222,22},'name',{'mike','hike'},'major','tele','score',{rand(2,1)*100,rand(2,1)*100})
xuesheng.score
7、求S=20+21+22+23+24+……+210的值(提示:
利用求和函数与累乘积函数。
)
解:
a=2*ones(1,10)
b=cumprod(a)
c=sum(b)+1
aa=2*ones(1,11)
aa
(1)=1
bb=cumprod(aa)
cc=sum(bb)
8、建立矩阵A并回答有关问题
A{1,1}=1;
A{1,2}='Brenden';
A{2,1}=reshape(1:
9,3,3);
A{2,2}={12,34,2;54,21,3;4,23,67};
1)使用访问的方式如何将Brenden改写成BRENDEN?
2)分别执行A(3)=[]和A{3}=[]后,A的值各是多少?
并说明原因。
解:
A{1,1}=1;
A{1,2}='Brenden';
A{2,1}=reshape(1:
9,3,3);
A{2,2}={12,34,2;54,21,3;4,23,67};
A{1,2}=upper(A{1,2})
A{3}=[]
A(3)=[]
9、利用MATLAB提供的rand函数和圆整函数随机生成4X3整数矩阵A,进行如下操作
1)A各列元素的平均值和中值
2)A的最大元素和最小元素及它们的位置
3)求A的每行元素的和以及全部元素之和
4)分别对A的每列元素按升序、每行元素按降序排列
解:
A=round(rand(4,3))
A_mean=mean(A)
A_median=median(A)
A_max=max(max(A))
A_min=min(min(A))
[x,y]=find(A==A_max)
[xx,yy]=find(A==A_min)
A_maxlocal=[x
(1)y
(1)]
A_minlocal=[xx
(1)yy
(1)]
A_rsum=sum(A,2)
A_sum=sum(sum(A))
A_csort=sort(A)
A_rsort=abs(sort(-A,2))
实验三、MATLAB程序设计
实验内容及步骤
1、输入一个百分制成绩,要求输出成绩等级A、B、C、D、E。
其中90分~100分为A,80分~89分为B,70分~79为C,60分~69分为D,60分以下为E。
要求:
1)分别用if语句和switch语句实现
2)对不合理的成绩应输出出错信息“输入的成绩不合理”(若成绩出现小数,则只能是“.5”)
解:
score=input('请输入您的分数:
');
ifrem(score,0.5)==0
switchscore
casenum2cell(90:
0.5:
100)
disp('您的成绩等级为A')
casenum2cell(80:
0.5:
89)
disp('您的成绩等级为B')
casenum2cell(70:
0.5:
79)
disp('您的成绩等级为C')
casenum2cell(60:
0.5:
69)
disp('您的成绩等级为D')
casenum2cell(0:
0.5:
59.5)
disp('您的成绩等级为E')
otherwise
disp('你输入的成绩不合理')
end
else
disp('你输入的成绩不合理,若出现小数只能是0.5')
end
2、设计程序,完成两位数的加、减、乘、除四则运算,即产生两个两位随机整数,再输入一个运算符号,做相应的运算,显示相应的结果,并要求结果显示类似于“a=x+y=34”。
(sy312.m)
解:
a=input('请输入一个数:
');
b=input('请再输入一个数:
');
fuhao=input('请输入一个运算符号(+-*/):
','s');
switchfuhao
case{'+'}
he=a+b;
disp(['输入的两数和=',num2str(a),'+',num2str(b),'=',num2str(he)])
case{'-'}
he=a-b;
disp(['输入的两数差=',num2str(a),'-',num2str(b),'=',num2str(he)])
case{'*'}
he=a*b;
disp(['输入的两数乘积=',num2str(a),'*',num2str(b),'=',num2str(he)])
case{'/'}
he=a/b;
disp(['输入的两数商=',num2str(a),'/',num2str(b),'=',num2str(he)])
otherwisedisp('请输入正确的符号')
end
3、求下列分段函数的值
要求:
用if语句实现,分别输出x=-5.0,-3.0,1.0,2.0,2.5,3.0,5.0时的y值。
其中x的值以向量的形式从键盘输入。
(sy313.m)
解:
x=[];
y=[];
x=input('请输入x的值:
');
fork=1:
length(x)
ifx(k)<0&x(k)~=-3
y(k)=x(k).^2+x(k)-6;
elseifx(k)>=0&x(k)<10&x(k)~=2&x(k)~=3
y(k)=x(k).^2-5*x(k)+6;
else
y(k)=x(k).^2-x(k)-1;
end
end
fori=1:
length(y)
disp(['y(',num2str(x(i)),')','=',num2str(y(i))]);
end
实验四MATLAB程序设计
实验内容及步骤
1、分别使用for循环语句和while循环语句找出最小的n值,使得n!
>10100,并求出n!
。
要求显示的结果为
n=70
n!
=1.197857e+100>1e100
或
70!
=1.197857e+100>1e100
用IF语句执行如下:
s=1;
forn=1:
100
s=s*n;
if(s>10^100)
break;
end
end
str1=['n=',num2str(n)];
str2=['n!
=',num2str(s)];
disp(str1)
disp(str2)
用WHILE语句执行如下:
n=1;
s=1;
while(s<=10^100)
s=s*n;
n=n+1;
end
str1=['n=',num2str(n-1)];
str2=['n!
=',num2str(s)];
disp(str1)
disp(str2)
2、
已知f1=1,n=1
f2=0,n=2
f3=1,n=3
fn=fn-1-2fn-2+fn-3,n>3
求f1~f50中:
1)最大值和最小值及它们的位置,各数之和(最大值给变量MAX,其位置给变量x,最小值给变量MIN,其位置给变量y,各数之和给变量SUM)。
2)正数、零、负数的个数(依次赋值给变量positive,zero,negative)。
法一:
clear;
f
(1)=1;
f
(2)=0;
f(3)=1;
forn=4:
50
f(n)=f(n-1)-2*f(n-2)+f(n-3);
end
[MAX,x]=max(f)%注意不要分号,要执行的语句
[MIN,y]=min(f)
SUM=sum(f)
positive=length(find(f>0))
zero=length(find(f==0))
negative=length(find(f<0))
MAX=
406631
x=
49
MIN=
-403795
y=
50
SUM=
76861
positive=
25
zero=
2
negative=
23
法二:
clearall,clc
forn=1:
50
ifn==1
f
(1)=1;
elseifn==2
f
(2)=0;
elseifn==3
f(3)=1;
elseifn>3
f(n)=f(n-1)-2*f(n-2)+f(n-3);
end
end
[MAX,y]=max(f)
[Min,x]=min(f)
positive=length(find(f>0))
zero=length(find(f==0))
negative=length(find(f<0))
3、Fibonacci数组的元素满足Fibonacci规则:
ak+2=ak+ak+1,(k=1,2,3,…);且a1=a2=1。
请设计一段程序,求出该数组中第一个大于10000的元素
要求显示的结果为:
i=21
a(i)=10946
或者
a(21)=10946
法一:
a
(1)=1;
a
(2)=1;
fork=1:
10000%不能是3:
10000
a(k+2)=a(k)+a(k+1);
ifa(k)>10000
break;
end
end
disp(['k=',num2str(k)])
disp(['a(k)=',num2str(a(k))])
法二:
clear,clc
s=1;
forn=1:
inf
s=s*n;
ifs>10^100
break
end
end
fprintf('%d!
=%1.6e>1e100\n',n,s)
试验五函数文件
实验内容及步骤
1、编写一个函数文件chengji.m,用于求两个矩阵的乘积和点乘,然后在命令行窗口中调用该函数(提示:
使用varargout函数)
要求:
1)当两矩阵是尺寸相同的方阵时,返回它们的乘积和点乘。
2)当两矩阵不是尺寸相同的方阵时,则根据它们的尺寸,分别进行乘积或点乘
3)当两矩阵的尺寸不能满足乘积或点乘的要求时,则提示“这两个矩阵不能乘”
解:
functionvarargout=chengji(a,b)
[x,y]=size(a);
[xx,yy]=size(b);
ifxx==yy&x==y&x==xx
varargout{1}=a*b;
varargout{2}=a.*b;
elseifx==xx&y==yy
varargout{1}=a.*b;
disp('只能做点乘')
varargout{2}=0;
elseifx==yy&xx==y
disp('可以做两种矩阵乘')
varargout{1}=a*b;
varargout{2}=b*a;
elseifx==yy||xx==y
try
varargout{1}=a*b;
disp('只能做矩阵乘')
varargout{2}=0;
catch
varargout{1}=b*a;
disp('只能做矩阵乘')
varargout{2}=0;
end
else
error('这两个矩阵不能乘')
end
2、编写一函数qiuhe.m,实现sum(A)的功能,其中A为矩阵。
解:
functiony=qiuhe(a)
y=[];
[x,yy]=size(a);
ifx==1
s=0;
fork=1:
yy
s=s+a(1,k);
end
y=s;
else
forj=1:
yy
s=0;
fori=1:
x
s=s+a(i,j);
end
y(1,j)=s;
end
end
3、编写一个阶乘函数jiecheng.m,然后在试验三的编程题“分别使用for和while语句找出最小的n值,使得n!
>10100,并求出n!
”程序中调用该函数。
解:
functions=jiecheng(n)
s=1;
ifn==0
s=1;
elseifn<0
error('n必须大于等于0')
else
fori=1:
n
s=s*i;
end
end
实验六数据插值与曲线拟合实验
实验内容
1.已知原始数据
,插值点为
,试用四种不同的插值方法进行插值,并在一副图中绘出四种插值曲线。
解:
clear,clc
x=0:
1:
4*pi;
y=sin(x).*exp(-x/5);
xi=0:
0.3:
4*pi;
y1=interp1(x,y,xi,'nearset');
y2=interp1(x,y,xi,'linear');
y3=interp1(x,y,xi,'spline');
y4=interp1(x,y,xi,'cubic');
plot(x,y,'-m',xi,y1,'*r',xi,y2,'ok',xi,y3,'^b',xi,y4,'+g')
legend('原始数据','最近点插值','线性插值','样条插值','立方插值')
title('第一题四种插值方法进行插值','FontName','隶书','FontSize',20)
xlabel('X轴','FontName','隶书','FontSize',16)
ylabel('Y轴','FontName','隶书','FontSize',16)
2.考虑下面的数据,一位举重教练收集了不同性别的举重动员每个年龄的最大举重磅数,他相信这三者之间存在着函数关系,请创建一个年龄数组,以便估算当前队伍中队员(要求13~20岁每一岁都有)的最大举重。
重
举
大
最
13
15
17
19
20
男
270
290
330
350
380
女
250
270
310
330
360
解:
clear,clc
t=[1315171920];
sex=[0,1]';
y=[270290330350380;250270310330360];
x=[13:
20];
sex_2=[0,1]';
y_2=interp2(t,sex,y,x,sex_2)
surf(x,sex_2,y_2)
3.某乡镇企业2004-2010年的生产利润如下
年份
2004
2005
2006
2007
2008
2009
2010
利润(万元)
70
122
144
152
174
196
202
要求用多项式拟合法预测出该企业2011年和2012年的利润,并绘出拟合图。
解:
x=2004:
2010;
y=[70122144152174196202];
k=polyfit(x,y,1);%得到系数
x1=2004:
2013;
y1=polyval(k,x1);
plot(x,y,'-ro',x1,y1,'-b*');
title('某乡镇企业2004-2013年的生产利润')
legend('04-10年的利润','04-13年的利润趋势线')
xlabel('年份');
ylabel('利润');
text(2011,polyval(k,2011),'<---2011年利润')
text(2012,polyval(k,2012),'<---2012年利润')
gridon
4.先使用命令load加载census.mat得到一组数据(cdate,pop),该数据是美国自1790到1990年(以10年为一单位)的总人口。
利用回归法拟合,预测出美国在2010年的人口总数,写出拟合模型
,并绘出拟合图。
解:
clearall,clc
load('census.mat');
nian=[1990:
2010];
p=polyfit(cdate,pop,2);
z=polyval(p,cdate);
zz=polyval(p,nian);
my=mean(pop);
mz=mean(z);
R=sum((pop-my).*(z-mz))./sqrt(sum((pop-my).^2).*sum((z-mz).^2))
plot(cdate,pop,'*',cdate,z,'r',nian,zz,'b-')
xlabel('年份(十年)','FontName','隶书','FontSize',16)
ylabel('人口(百万)','FontName','隶书','FontSize',16)
title('第四题美国自1790-1990年的总人口','FontName','隶书','FontSize',20)
text(1990,248.73,'<----之后为拟合数据')
legend('原数据','拟合曲线')
实验七MATLAB绘图
实验内容
1、二维图形的绘制
1)设计程序,在一个图形窗体中画出函数y=ex和y=logx的特性曲线。
其中y=ex中x取值为(-2:
0.1:
2),y=logx中x取值为(0.1:
0.1:
5)。
要求:
要有图例、标题('二维图')、坐标轴标签('x轴数据'和'y轴数据');每条曲线的clm自己设置。
解:
clear,clc
x1=-2: