操作系统:win10 Matlab版本:Matlab R2017a
1.分别求一个三位正整数的个位、十位、百位。
x=input('x=?:'); a=fix(x/100) %百位 b=rem(fix(x/10),10) %十位 c=rem(x,10) %个位
批注:默认数据类型为8位double,更改输出显示为format,默认显示小数点后四位。
2.求【1,100】区间的所有素数。
x=1:100; y=isprime(x);%找到素数,返回1 y1=find(y);%素数的位置 x(y1)%输出
3.求全部水仙花数。
水仙花数是指:一个三位数,其各位数字立方和等于该数本身。例如:370=33+73+00.这就说明370是一个水仙花数。
自己写的版本:
clc,clear for i=100:1:999 a=fix(i/100); b=rem(fix(i/10),10); c=rem(i,10); if (a^3+b^3+c^3==i) disp(i) end end
例子程序:
i=100:999; m1=fix(i/100); m2=rem(fix(i/10),10); m3=rem(i,10); k=find(i==m1.*m1.*m1+m2.*m2.*m2+m3.*m3.*m3) s=i(k)
批注:同学建议最好先求个位,虽然是个人习惯,不过我觉得确实先求个位会比较不乱,然后就是编写的时候求个位时就忘记自己求什么了,程序写成了rem(i,100),只输出一个数,找了好半天错误。一个流畅的思维也是编程的关键呐。
例子程序将多个数据存储为向量计算,可以省去循环,这个很可取,以后编程要注意。
4.建立字符串向量,实现①取前1~5个字符 ②倒叙 ③小写字母改为大写字母 ④求小写字母个数
clc,clear s='My Name is amber'; %开始写的是s=('My Name is amber','s'),不知道哪来的写法 s(1:5) %取前5个字符 s1=s(end:-1:1); %之前写错为s=(end:1) %然后写的是s=s(end:1) 输出为:空的1×0 char数组,说明没有倒叙 x=find(s>='a'&s<='z'); %小写字母改为大写字母,不会找小写字母T-T,看一眼例子 s(x)=s(x)-('a'-'A') %将找出的小写字母转换为大写字母 length(x) %求小写字母个数
批注:①字符串中如果含有单引号,要用两个引号来实现例如s='I ''m amber'。②Matlab中的逻辑运算符为&(与)、|(或)、~(非),matlab中的&和&&本质是一样的,但&先计算左右两个式子的真假,再逻辑与,适用于矩阵间的逻辑运算,而&&前一个式子为假就不计算下一个式子了,效率更高,只适用于单个元素。
5.(1)产生5阶两位随机整数矩阵A。(2)产生均值为0.6,方差为0.1的5阶正态分布随机矩阵B。
100*rand(5)
0.6+sqrt(0.1)*randn(5)
批注:以上分别对应(1)(2)。注意①rand产生的是(0,1)区间均匀分布的随机矩阵,而randn产生均值为0,方差为1的标准正态分布。②μ+σx是得到均值为μ,方差为σ的平方的随机数。
6.验证魔方矩阵的主、副对角线元素之和相等。
clc,clear A=magic(8);%产生8阶魔方矩阵 a=diag(A); A1=fliplr(A);%将矩阵左右翻转,上下翻转也可以,这样副对角线就移到主对角线了。 b=diag(A1); sum(a); sum(b); if(sum(a)==sum(b)) fprintf('same ') else fprintf('no ') end
批注:①左右翻转和上下翻转都可以将矩阵的副对角线移到主对角线上;②matlab中输出为fprintf不是printf。
7.求3~20阶魔方矩阵的秩并绘成直方图。
clc,clear for i=3:1:20 A=magic(i); x(i-2)=rank(A); end disp(x) hist(x)%频率直方图 bar(x)%仅仅把数据用直方图的形式展现出来
批注:①magic中无法使用向量一次求出,只能借助循环。②hist可以绘制频率直方图,而bar仅仅是把数据用直方图的形式展现出来。
8.求2~10阶希尔伯特矩阵的条件数。
clc,clear for i=2:1:10 A=hilb(i); x(i-1)=cond(A); end disp(x) %例子中加的 format long x'
批注:运行后,可以看到随着阶数的增加,希尔伯特矩阵的条件数不断增大,矩阵性能变差。条件数越接近1,矩阵的性能越好。(但还是不太理解矩阵的性能是刻画什么的)