这个名字显然不是我取的,是货真价实的信科院课程。
【优雅】、【matlab】和【机器学习】,buff叠满了属于是。
当然,至少到目前(4.7),还停留在matlab的阶段,机器学习下周开始。
matlab基础
数据类型
整型:无符号整型和有符号整型
浮点型:single,double
取整函数:round,fix,floor,ceil
类型相同的数据才能运算
运算符、表达式
/(除或右除)
\(反除或左除)
^乘幂
'共轭转置
.* 矩阵乘或点乘
./ 矩阵除或点除
.\ 矩阵左乘或左除
.^ 矩阵乘幂或点乘幂
.' 转置 (矩阵行转换为列 ,复元素不做共轭)
~= 不等于
指数函数
exp,log,log10,log2,pow2,sqrt
取整函数和求余函数:
round,fix,floor,ceil,rem,mod,sign
矩阵变换函数:
fliplr,flipud,flipidm,rot90,diag,tril,triu,det
其他函数:
min,max,mean,median,std,diff,sort,length,norm,sum,prod,dot,cumsum,cumprod,cross
输入输出
input
disp
fprintf
分支结构
if 语句
if condition
Execute the statement
end
if—elseif—else------end多分支语句
switch语句
switch 表达式
case 表达式1
语句1
case 表达式2
语句2
... ...
case 表达式n
语句n
otherwise
语句n+1
end
for 循环
for 循环变量=expr1:expr2:expr3
循环体语句
end
#Example
s=0;
for i=1:2:12
s=s+i;
end
while 循环
whlie <循环判断的语句v>
循环体
end
Example:
s=0;
i=1;
while i <=12
s=s+i;
i=i+2;
end
匿名函数
匿名函数: fhandle=@(arglist)expr
Example:
fhandle=@(x,y)(x.^3+y.^3);
a=5;
b=8;
fhandle(a,b)
二维绘图
plot(x1,y1,'LineSpec1',x2,y2,'LineSpec2',...,xn,yn,'LineSpecn')
添加坐标标注、标题、网格以及标注的图形。
xlabel,ylabel,title,legend,grid on/off,axis.figure,text
标注数据点
scatter(x,y,sz,c,mkr,'filled')
(x,y)数据点
sz数据点大小
c颜色
mkr标记
'filled’实心,默认空心
曲线
plot3(X1,Y1,Z1,'LineSpace',...)
绘制三维曲线图(sin(x),x,cos(x))
条形图
bar,barh,bar3,bar3h
直方图
hist(y,m),hist(y,x)
y=random(10,1);
y=randn(10,6);
饼图
pie(x,explode,'label');
pie3(x,explode,'label');
子图
subplot
其他绘图
双纵坐标图形plotyy
封闭图形patch
半对数图semilogx
隐函数作图
ezplot,ezplot3,ezmesh,ezsurf
课程作业
第一次作业:matlab脚本文件
输入长方形的长和宽,计算长方形的周长和面积并输出
l = input('输入长:');
w = input('输入宽:');
zc=2*l+2*w
s = l * w;
fprintf('%d',zc);
fprintf('%d',s);
输入三角形的三条边(要满足构成三角形的条件),求三角形的周长和面积
a = input('输入第一条边:');
b = input('输入第二条边:');
c = input('输入第三条边:');
if (a+b>c && a+c>b && b+c>a)
zc= a+b+c;
p = zc*0.5;
s = sqrt(p*(p-a)*(p-b)*(p-c));
else
fprintf('输入不正确');
end
fprintf('周长=%d ',zc);
fprintf(' 面积=%d',s);
输入一元二次方程的三个系数,求一元二次方程的根。
我的答案:
a = input('输入第一个系数:');
b = input('输入第二个系数:');
c = input('输入第三个系数:');
d=b*b-4*a*c;
if (d>=0)
x=((-1*b)+sqrt(d))/(2*a);
y=((-1*b)-sqrt(d))/(2*a);
fprintf('x1=%d ',x);
fprintf('x2=%d ',y);
else
fprintf('无实根');
end
给定半径,求球的体积和表面积。
r = input('输入半径:');
v=(4/3)*pi*r^3;
s= 4*pi*r^2;
fprintf('球的体积为:%d\n',v);
fprintf('球的面积为:%d',s);
输入三个数,将其按照从小到大的顺序排列。
a = input('输入第一个数:');
b = input('输入第二个数:');
c = input('输入第三个数:');
array = [a,b,c];
b=sort(array);
fprintf('%d',b);
第二次作业:分支语句
输入一个字符,如果是大写字母,输出其后继字符及其ASCII值,如果不是大写字母,原样输出。例如,输入字符B,输出“字母B的后继字符为C,对应的ASCII码值为67”,注意字母Z的后继字符为A。
ch=input('请输入一个字符:','s');
if ch>='A' && ch<'Z'
fprintf('字母%c的后继字符为%c,对应的ASCII码值为%d',ch,ch+1,ch+1);
elseif ch =='Z'
fprintf('字母%c的后继字符为%c,对应的ASCII码值为%d',ch,ch-25,ch-25);
else
fprintf(ch);
end
输入一个小于10000的整数,求出是几位数并且逆序输出。例如,输入123,输出“该数为3位整数,其逆序数为321”
r = input('输入一个整数:');
n=floor(log10(r))+1
a=floor(r/1000);
b=floor((r-1000*a)/100);
c=floor((r-1000*a-100*b)/10);
d=floor((r-1000*a-100*b-10*c)/1);
if n==4
fprintf('该数为%d位整数,其逆序数为%d%d%d%d\n',n,d,c,b,a);
elseif n==3
fprintf('该数为%d位整数,其逆序数为%d%d%d\n',n,d,c,b);
elseif n==2
fprintf('该数为%d位整数,其逆序数为%d%d\n',n,d,c);
elseif n==1
fprintf('该数为%d位整数,其逆序数为%d\n',n,d);
else
fprintf('输入格式错误');
end
在编辑窗口中:输入学生成绩,输出该成绩的等级。等级规定如下:[90,100]为A等,[80,90)为B等,[70,80)为C等,[60,70)为D等,[0,60)为E等
g = input('输入学生成绩:');
if (90<=g)&&(g<=100)
fprintf('成绩等级为A等');
elseif (80<=g)&&(g<90)
fprintf('成绩等级为B等');
elseif (70<=g)&&(g<80)
fprintf('成绩等级为C等');
elseif (60<=g)&&(g<70)
fprintf('成绩等级为D等');
elseif (0<=g)&&(g<60)
fprintf('成绩等级为E等');
else
fprintf('输入格式错误');
end
商场购物,100件以下,不优惠,100199件95折,200399件90折,400799件85折,8001499件80折,1500件以上,75折。输入所购货物的单价、件数,求实际付款数目。
p = input('输入货物单价:');
n = input('输入货物件数:');
if n<100
fprintf('实际付款为%d',n*p);
elseif (100<=n)&&(n<199)
fprintf('实际付款为%d',n*p*0.95);
elseif (200<=n)&&(n<399)
fprintf('实际付款为%d',n*p*0.9);
elseif (400<=n)&&(n<799)
fprintf('实际付款为%d',n*p*0.85);
elseif (800<=n)&&(n<1499)
fprintf('实际付款为%d',n*p*0.8);
else
fprintf('实际付款为%d',n*p*0.75);
end
第三次作业:switch和循环
从键盘输入两个数和运算符,用switch语句实现一个简单的四则运算计算器。采用循环设置10个题目,输出做对多少题。
for i = 1:10
fprintf('第%d题',i)
a =input('a=');
b =input('b=');
op=input('op=','s');
answer=input('answer=');
count=0;
switch op
case '+'
fin=a+b;
case '-'
fin=a+b;
case 'x'
fin=a*b;
case '/'
fin=a/b;
end
if fin ==answer
fprintf('正确\n');
else
fprintf('错误\n');
end
end
百钱买百鸡
公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡, 其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。
n=100;
for x =1: (floor(n / 5) + 1)
for y = 1: (floor(n / 3) + 1)
s = n - 5 * x - 3 * y;
z = s*3;
p = x + y + z;
if p == n
fprintf("公鸡数量为%d " ,x );
fprintf("母鸡数量为%d " ,y );
fprintf("小鸡数量为%d\n", z);
else
continue
end
end
end
验证哥德巴赫猜想:任何一个大于4的偶数都可以表示为两个素数的和。
n=input('请输入一个大于4的偶数:');
i=2;
while i>1&&i<n/2
if isprime(i)==1
j=n-i;
if isprime(j)==1
fprintf('\n%d=%d+%d',n,i,j);
end
end
i=i+1;
end
输入一个10进制整数,转换为二进制输出
n=input('请输入一个非负十进制整数:');
num=dec2bin(n);
fprintf(num)
斐波那契数列
斐波那契数列:又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(3)=2,F(n)=F(n-1)+F(n-2)(n>=4,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
要求:(1)编写函数fibo,功能是求斐波那契数列的第n项。(2)编写测试脚本,调用fibo函数,输出斐波那契数列的前30项。
function [x]=fibo(n)
if (n==1) || (n==2)
x=1;
else
x=fibo(n-1)+fib(n-2);
end
end
x=fibo(30)
fprintf(x)
for i=1:30
fprintf('%d \n',fibo(i));
end
第四次作业:数据可视化
第一题
作图:在同一图中显示正弦函数y1=sin(x)与直线y2=-x+0.5,要求显示标题、横坐标标签、纵坐标标签、图例,对y1、y2做文本标注。x取值[-2pi,2pi],然后通过解方程组将解在图中用星号标注
clear
h1=figure(1)
x=-2*pi:0.1:2*pi;
y1=sin(x);
y2=(-1)*x+0.5;
plot(x,y1,'b-','linewidth',1)
hold on
plot(x,y2,'r-..','linewidth',2)
xlabel('x','fontsize',18)
ylabel('y','fontsize',18)
title('示例曲线','Color','r','fontsize',18)
legend('y1=sin(x)','y2=-x+0.5')
grid on
f = @(x)(sin(x)+x-0.5);
xj=fzero(f,3);
yj=sin(xj)+xj-0.5
text(xj,yj+0.2,num2str(yj))
plot(xj,yj+0.2,'g-*')
第二题
在第1个子窗口用极坐标画图显示r=0.5(1+cos(θ)),其中θ∈[0,2π];在第2个子窗口作填充图,填充坐标矢量为X=[0 0.2 0.8 1 0.5 0],Y=[1 0 0 1 1.8 1],填充颜色为蓝色;在第3个子窗口作双y轴图y1=sin(t),t∈[0,4π],y2=20*cos(t);在第4个子窗口显示相图x=sin(t),y=cos(t).如图所示。
subplot(2,2,1);
theta=0:0.1:2*pi;
r=0.5*(1+cos(theta));
polarplot(theta,r);
subplot(2,2,2);
x2=[0 0.2 0.8 1 0.5 0]
y2=[1 0 0 1 1.8 1]
fill(x2,y2,'b')
subplot(2,2,3);
t=0:0.01:4*pi;
y1=sin(t)
y3=20*cos(t)
plotyy(t,y1,t,y3)
subplot(2,2,4);
m=-1:0.1:1;
xt = cos(m);
yt = sin(m);
ezplot(xt,yt,[-1,1])
第三题
第四题
第五次作业:回归分析
1
clear
t = [0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 5.0 6.0 6.1 7.0];
f = [300 281 261 244 228 214 202 191 181 164 151 149 141];
% [p,S]=polyfit(t,h,2);
scatter(t,f)
p=polyfit(t,f,3);
xi=1:0.2:10;
yi=polyval(p,xi);
plot(xi,yi,t,f,'r*');
xlabel('time(时间)','fontsize',18)
ylabel('temp(温度)','fontsize',18)
legend('time(时间)-temp(温度)曲线')
fprintf('由图及几何曲线可知,t=9时f为126.4\n');
2
clc;
clear;
close all;
x1 = [180 201 205 208 213 217 218 222 226 230 233 238 240 242 253]'; % 跳高成绩
x2 = [280 240 226 224 220 217 225 221 211 213 199 198 195 186 183]'; % 1000m成绩
x3 = [153 170 162 160 162 165 170 168 169 179 172 172 175 181 176]'; % 跳绳个数
Y = [60 75 70 70 75 75 85 80 80 85 90 90 90 95 95]'; % 综合打分
figure(1);
hold on;
plot(x1,'bo');
plot(x2,'ro');
plot(x3,'go');
plot(Y,'mo','LineWidth',1);
legend('跳高成绩(cm)','1000m成绩(s)','跳绳个数','去年的综合分数(100分制)')
len = length(Y);
pelta = ones(len,1);
x = [pelta, x1, x2, x3];
[b,bint,r,rint,stats]=regress(Y,x,0.03);
BS = b(1) + b(2) .* x1 + b(3) .* x2 + b(4) .* x3 ;
figure(2);
hold on;
plot(x1,'bo-');
plot(x2,'ro-');
plot(x3,'go-');
plot(Y,'mo-');
plot(BS,'kx-','LineWidth',1);
legend('跳高成绩(cm)','1000m成绩(s)','跳绳个数','去年的综合分数(100分制)','多元线性回归拟合曲线')
R_2 = 1 - sum( (BS - Y).^2 )./ sum( (Y - mean(Y)).^2 );
str = num2str(R_2);
disp(['拟合优度为:',str])
fprintf('由图可知,散点可以线性拟合,使用多元线性回归拟合\n');