文章目录
- [1.1 Matlab基本语法](#1.1 Matlab基本语法)
-
- [第1关:Hello MATLAB!](#第1关:Hello MATLAB!)
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码程序](#2. 代码程序)
- 第2关:变量与表达式
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码程序](#2. 代码程序)
- 第3关:初遇矩阵(数组)
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码程序](#2. 代码程序)
- [1.2 Matlab语言程序设计基础](#1.2 Matlab语言程序设计基础)
-
- 第1关:循环结构
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码程序](#2. 代码程序)
- 第2关:符号替换
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码程序](#2. 代码程序)
- 第3关:Fibonacci数列计算
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码文件](#2. 代码文件)
- 第4关:序列稳态值
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码程序](#2. 代码程序)
- 第5关:分段函数
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码文件](#2. 代码文件)
- [1.3 MATLAB矩阵进阶](#1.3 MATLAB矩阵进阶)
-
- 第1关:字符串操作
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码程序](#2. 代码程序)
- 第2关:矩阵运算
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码程序](#2. 代码程序)
- 第3关:数据的导入与导出
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码程序](#2. 代码程序)
- [1.4 MATLAB程序控制结构进阶](#1.4 MATLAB程序控制结构进阶)
-
- 第1关:智取第一式:分支结构
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码程序](#2. 代码程序)
- 第2关:智取第二式:循环结构
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码文件](#2. 代码文件)
- 第3关:智取第三式:自定义函数
-
- [1. 编程要求](#1. 编程要求)
- [2. 代码文件](#2. 代码文件)
1.1 Matlab基本语法
第1关:Hello MATLAB!
1. 编程要求
输出字符串"Hello MATLAB!"
2. 代码程序
matlab
disp('Hello MATLAB!') %字符类型的数据是用英文单引号' '来表示的
第2关:变量与表达式
1. 编程要求
本关的任务是设计一个一元二次函数 f(x) = 3x^2+2x+1,要求给x输入任意一个函数,能够输出它的结果 fx。
2. 代码程序
- num2str(A):用于将数字A转换为字符串,"number to string";
- input():用于用户对程序内输入数据,x = input(prompt) 或 str = input(prompt,'s'),前者表示输入一个数值,后者表示输入一个字符串,用户输入一个数据,以回车键结束,prompt表示提示语,一般是一个字符串,且这个字符串必须有(可以为空字符串'')。
matlab
x = input(''); %输入数字x
fx = 3*x^2+2*x+1;
disp(num2str(fx)); %输出字符串
第3关:初遇矩阵(数组)
1. 编程要求
创建一个以1~9顺序组成的3x3的矩阵A(即第一行为1,2,3,第二行为4,5,6,第三行为7,8,9),将每一行的数据分别求和,并存储到当前行的最后一列位置(第3列)去,最后用disp函数以字符串形式输出每一行和。
2. 代码程序
matlab
A = [1:3;4:6;7:9];
A(;,end) = sum(A,2); %每一行求和,结果存在最后一列中
%A(end,:) = sum(A,1); 对每一列求和,结果存在最后一行中
disp(num2str(A(1,end)));
disp(num2str(A(2,end)));
disp(num2str(A(3,end)));
1.2 Matlab语言程序设计基础
第1关:循环结构
1. 编程要求
列出1000以内的除13余2的所有整数
2. 代码程序
matlab
x = []; % 定义一个空向量
for i = 1:1000
if rem(i,13) == 2
x = [x, i]; % 将i添加到向量x的末尾
end
end
disp(num2str(x(20:30))); % 显示第21到30个元素的字符串表示
第2关:符号替换
1. 编程要求
试用符号 fg 和 gf 分别表示函数 f(g(x)) 和 g(f(x)),最后输出fg和fg的表达式。
2. 代码程序
matlab
syms x; %syms声明符号变量x
f = x*sin(x)/(sqrt(x^2-2)*(x+5));
g = tan(x);
%subs(f,x,y)表示f(x)中x用y替换
fg = subs(f,x,g);
gf = subs(g,x,f);
disp(fg);
disp(gf);
第3关:Fibonacci数列计算
1. 编程要求
试编写小程序列出Fibonacci数列的前120项,将数列的值存入数组a中。
2. 代码文件
matlab
a(1) = 1;
a(2) = 1;
for i = 3:120
x = a(i-1)+a(i-2);
a = [a,x];
end
disp(a(100:120));
第4关:序列稳态值
1. 编程要求
已知该序列当n足够大时将趋于某个固定的常数,试选择合适的n值,找出该序列的稳态值(达到精度要求10^−14),并找出其精确地数学表示。
2. 代码程序
matlab
x1 = sym(1); %sym函数用于创建符号表达式
x2 = x1/2+3/(2*x1);
e = 10^(-14);
n = 2;
while double(abs(x2-x1)) > e
x1 = x2;
x2 = x1/2+3/(2*x1);
n = n+1;
end
steady_value = x2;
disp(num2str(n))
disp(steady_value)
第5关:分段函数
1. 编程要求
y = h.(x>D)+h./(D.x).((x<=D) & (x>=-D))-h.(x<-D),根据提示,在右侧编辑器补充代码,根据输入的值h、D和x的变量值,计算如下分段函数的值:
2. 代码文件
- 对于逻辑表达式当 x<10 时 y=sin(x),可以用 y=sin(x).*(x<10) 语句实现。
matlab
D = str2num(input('','s'));
h = str2num(input('','s'));
x = str2num(input('','s'));
y = h.*(x>D)+h./(D.*x).*((x<=D)&(x>=-D))-h.*(x<-D);
disp(num2str(y))
1.3 MATLAB矩阵进阶
第1关:字符串操作
1. 编程要求
读取3个字符串,分别取出每个字符串的第1个字符,拼接成一个新的字符串再输出(要求拼接顺序为原字符串读取的顺序,即第1个字符串的第1个字符同样是拼接后的字符串的第1个字符)。
2. 代码程序
matlab
A = input('','s');
B = input('','s');
C = input('','s');
D = strcat(strcat(A(1),B(1)),C(1)); %strcat水平连接字符串
disp(D);
第2关:矩阵运算
1. 编程要求
对给定的3个学生的三门成绩进行加权平均,算出学分绩,并且输出学分绩最高的同学的编号及学分绩。学分绩就是将给定的所有门成绩,各自乘上对应的学分,再除以总的学分。例如1号同学的三门成绩分别为90、80和70,三门课程的学分分别为3、2、4,那么学分绩的计算公式为 (90x3+80x2+70x4)/(3+2+4) = 78.89,这就是该同学的学分绩。
2. 代码程序
matlab
student_goals = [95,90,87;89,93,88;83,95,97]; %3名学生各自的三门成绩
course_credit = [2,4,5]; %三门课程各自的学分
%点乘.*即对应元素相乘
A = sum(student_goals(1,1:3).*course_credit);
B = sum(student_goals(2,1:3).*course_credit);
C = sum(student_goals(3,1:3).*course_credit);
S = [0,0,0];
S(1) = A/11;
S(2) = B/11;
S(3) = C/11;
%max函数默认按列进行操作
[y,I] = max(S); %求矩阵x中每列的最大值及其该元素的位置
%求矩阵中每行的最大值:max(S,[],2)
disp(num2str(I));
disp(num2str(y));
第3关:数据的导入与导出
1. 编程要求
- 导入一份给定的学生成绩单src/lesson3/student.mat,该文件在目录src/lesson3下,学生人数及课程数未知,只知道每一行代表一名学生的所有成绩,而且每一列代表不同课程的成绩。
- 导入一份给定的课程学分表src/lesson3/course_credit.mat,该文件在目录src/lesson3下,该数据只有一行,每一列代表一门课程的学分设置,数据个数保证和成绩单上的课程数一致。
- 对给定的所有学生的各门成绩分别进行加权平均,算出各自的学分绩,并且输出学分绩最低的同学的编号及学分绩。
- 学分绩就是将给定的所有门成绩,各自乘上对应的学分,再除以总的学分。例如1号同学的三门成绩分别为90、80和70,三门课程的学分分别为3、2、4,那么学分绩的计算公式为(90x3+80x2+70x4)/(3+2+4)= 78.89,这就是该同学的学分绩。
2. 代码程序
matlab
clc,clear;
%导入所有学生的各门成绩,注意这里是绝对路径引入
student_goals=load('src/lesson3/student.mat','-ascii');
%一个ascii编码形式存储的数据文件course_credit.mat
student_credits = load('src/lesson3/course_credit.mat','-ascii');
s = sum(student_credits);
A = student_goals.*student_credits;
B = sum(A,2)./s; %每行求和再除以总学分
[y,I] = min(B);
disp(num2str(I));
disp(num2str(y));
1.4 MATLAB程序控制结构进阶
第1关:智取第一式:分支结构
1. 编程要求
你现在扮演一名抗战时期的八路军地下工作者,组织上安排你去与另一名陌生的地下工作者会面,该同志与你会面时会向你说出他的上半句口令,你要完全正确的回答出下半句口令才会得到他的信任,从而顺利完成任务。组织上设置的口令有很多,但是,一般大家只会抽取其中的一句进行问答。所有问答展示如下:
- Q: 田鸡炖土鸡 A: 附近有妖气
- Q: 熟读唐诗三百首 A: 不会吟诗我不走
- Q: 天空飘来5个字 A: 关我什么事
- Q: Who are you A: 社会主义接班人
- 如果问题不是上述的4种情况之一,则回答:我不认识你
2. 代码程序
matlab
clc,clear;
question = input('','s');
answer = ''; %答案初始为空字符串
switch question
case '田鸡炖土鸡'
answer = '附近有妖气';
case '熟读唐诗三百首'
answer = '不会吟诗我不走';
case '天空飘来5个字'
answer = '关我什么事';
case 'Who are you'
answer = '社会主义接班人';
otherwise
answer = '我不认识你';
end
disp(answer);
第2关:智取第二式:循环结构
1. 编程要求
所谓的"斐波那契数列"其实并不复杂。给定初始的两个数,比如1和1,目前的数列中就只有1,1两个数。现在要对数列进行扩展,后面的每个数都是由前面的两个数求和得到的。例如第三个数为1+1=2,第四个数为1+2=3,以此类推为,最终构成的数列就是1,1,2,3,5,8,13......要求输出指定序号的某个数,比如第3个数,那就是2,比如第6个数,那就是8。创建一个长度为100的斐波那契数列,前两个数据为1,1,要求输入一个100以内的序号n,输出序列中该序号n对应的斐波那契数。
2. 代码文件
matlab
clc;
clear;
num=input(''); %输入待输出斐波那契数的序号
f=zeros(1,100); %初始化
f(1) = 1;
f(2) = 1;
for i = 3:100
f(i) = f(i-1)+f(i-2);
end
disp(num2str(f(num))); %输出序号num对应的斐波那契数
第3关:智取第三式:自定义函数
1. 编程要求
将之前的两个关卡中的程序封装成两个函数answer_me和fibonacci,要求输入字符串answer_me的时候运行第一个关卡对应的函数answer_me,输入字符串fibonacci时运行第二个关卡对应的函数fibonacci。让我们一起开始新的内容吧。
- 要求创建的answer_me函数带一个字符串型输入参数,即answer_me(string),其中,string表示另一位地下工作者的问话,无返回值,其他要求同第一关卡要求(即在函数中输出对应于问题的回答)。
- 要求创建的fibonacci函数带一个整数型输入参数,即fibonacci(N),其中,N表示要输出值的序号,函数有一个返回值f,是序号N对应的斐波那契数(同第二关卡要求),即f=fibonacci(N),最后在主函数function_test中输出该值f。
2. 代码文件
matlab
function function_test(string,datain)
%string是待执行函数名,datain是函数的输入参数
if strcmp(string,'answer_me') %如果是answer_me函数
answer_me(datain); %执行函数,在函数内输出回答
end
if strcmp(string,'fibonacci') %如果是fibonacci函数
fab = fibonacci(datain); %执行函数,返回对应于序号num的斐波那契数
disp(num2str(fab)); %输出对应于序号num的斐波那契数
end
end
function answer_me(question)
switch question
case '田鸡炖土鸡'
answer = '附近有妖气';
case '熟读唐诗三百首'
answer = '不会吟诗我不走';
case '天空飘来5个字'
answer = '关我什么事';
case 'Who are you'
answer = '社会主义接班人';
otherwise
answer = '我不认识你';
end
disp(answer);
end
function fab = fibonacci(num)
f=zeros(1,100);
f(1) = 1;
f(2) = 1;
for i = 3:100
f(i) = f(i-1)+f(i-2);
end
fab = f(num);
end