Matlab训练3

路漫漫其修远兮,吾将上下而求索

Matlab官方帮助文档
1-1、1-2 进制转换
首先,matlab具有进制转化函数dec2bin(十进制转二进制),bin2dec(二进制转十进制),dec2base…但是注意:在使用上述函数的时候,只能实现非负整数与二进制数之间的转化,如果使用负整数的时候会出现错误。
1)十进制转其他进制
十进制整数进行N进制转换时,我们采用短除法,即“除N取余,逆序排列”法。具体是把十进制数,除以N,得到商和余数,保留余数继续除N,直到商为0,将余数倒过来排列即可。
小数则是“乘N取整,顺序排列”法。具体是把十进制数乘N后取整,保留整数部分后小数部分继续乘N,直到积中小数部分为0或者符合要求的精度(因为十进制小数转化为其他进制时可能会出现无限位的小数),将取出的整数部分按照取出的顺序排列即可。
2)其他进制转10进制
一般方法:逢N进1, 按照从低位到高位的权值来进行计算,第0位的权值就是N的0次方…依次递增下去,最后把结果进行相加即可。

1-1

clc;clear;
decNum=input('请输入一个10进制数:');
binNum=0;n=decNum;
i=1;remainder=0;
while n~=0
    remainder=mod(n,2);
    n=fix(n/2);    %注意这里的取整函数
    binNum=binNum+remainder*i;
    i=i*10;
end
fprintf("十进制数%d转换为二进制为%d\n",decNum,binNum);

1-2

clc;clear;
binNum=input('请输入一个2进制数:');
decNum=0;n=binNum;
i=0;remainder=0;
while n~=0
    remainder=mod(n,10);
    n=fix(n/10);    %注意这里的取整函数
    decNum=decNum+remainder*power(2,i);
    i=i+1;
end
fprintf("二进制数%d转换为十进制为%d\n",binNum,decNum);

1-3 思路:利用num2str进行转化,将八位数化为一维字符串数组后直接进行比较
即可。(理清减数与被减数的关系,注意最高位无论如何都是置一的)

clc;clear;
n=input('请输入第一个8位数n:');
m=input('请输入第二个8位数m:');
n=num2str(n);
m=num2str(m);
s=[1];
for i=2:8
	%字符串元素直接进行比较(通过比较ASCII码值的大小)
    if n(i)>=m(i)	
        s(i)=1;
    else
        s(i)=0;
    end
end
s

1-4 思路:边沿数值=矩阵最上面一行+矩阵底部一行+其他,其他的元素均为每一行的首元素或尾元素计算即可。

clc;clear;
n=input('请输入矩阵的行数n:');
m=input('请输入矩阵的列数m:');
array=input('请输入n行m列的矩阵,用[]括起来:');
s=sum(array(1,:))+sum(array(n,:));    %为避免与sum函数冲突,使用s为变量名,计算矩阵顶行与底行
for i=2:n-1
    s=s+array(i,1)+array(i,m);
end
fprintf("该矩阵的边缘数值和为:%d\n",s);

1-5 思路:直接相加,利用矩阵的基本运算组合

clc;clear;
n=input('请输入矩阵的行数与列数n:');
array=input('请输入n行n列的矩阵,用[]括起来:');
s=sum(sum(array(:,1:2:n)));
fprintf("该矩阵的奇数列和为:%d\n",s);

1-6、1-7均与因子有关
先列出求因子的模板。

%求n的所有因子
a=1:n;
factor=find(mod(n,a)==0);

原理:一个数的因子即能整除n的数利用mod函数加判断,然后巧用find函数
1-6

clc;clear;
j=1;
for i=1:100
    a=1:i;
    factor=find(mod(i,a)==0);
    %算和的时候除去本身
    if sum(factor)-i==i
        pfNum(j)=i;
        j=j+1;
    end
end
disp('100以内的完全数(perfect number)有:');
pfNum

1-7与1-6的区别不大

clc;clear;
j=1;
for i=1:100
    a=1:i;
    factor=find(mod(i,a)==0);
    if sum(factor)-i>i
        abNum(j)=i;
        j=j+1;
    end
end
disp('100以内的盈数(abundant number)有:');
abNum

1-8
看大家交上来的1-8,或多或少都不是那么完美。这个题目的1-8有两个要求,要求一: 找到和为1000的连续正整数序列。要求二: 输出对应整数列的中整数的个数。
思路:题目意思比较好懂,普通方法就是三层循环暴力破解,第一重控制这个序列的起点,第二重控制序列元素的个数,第三重输出符合题意的序列。但是这样耗费的时间比较长,假设我们要求的是和为n的连续正整数序列,那么最多可能要耗费 n 3 n^3 次遍历循环。但是经过改进后,循环最多循环 2 n + 1 2n+1 次遍历循环,时间是不是减少了很多!!!
改进方法: 观察题目,题目说的是连续的序列,所以可以考虑等差数列的性质。等差数列的求和方式有两种,一是 知道首项,尾项和公差,二是 知道首项/尾项,个数和公差。从题目来看,我们选择第二种方法更为合适。设序列起点为a,共有n个整数,则和 s = ( 2 a + n 1 ) n 2 s=\frac{(2a+n-1)n}{2}
将上面的公式稍加变形,得到 a = 2 s n n + 1 2 a=\frac{\frac{2s}{n}-n+1}2{} 由于a为正整数,所以一定有 ( 2 s n n + 1 ) (\frac{2s}{n}-n+1) % 2 = = 0 2==0 。因此我们可以考虑用控制个数n的方式直接求出符合题意的序列起点a,然后输出。

clc,clear;
n=1000;
for i=2:fix(sqrt(2*n+1))
    a=2*n/i+1-i;
    if mod(a,2)==0
        fprintf('1000=');
        for j=a/2:a/2+i-1
            if j==i+a/2-1
                fprintf('%d 共有%d个整数\n',j,i);
            else
                fprintf('%d+',j);
            end
        end
    end
end

一个有趣的现象:什么样的数可以写成连续的n个自然数之和,什么样的不能呢?运行上面的代码,改变n的值,我们发现除了 2 n 2^n 以外,其余所有数都可以写成该形式。
证明如下:
如果数s符合条件,由一开始的推导我们知道 s = ( 2 a + n 1 ) n 2 s=\frac{(2a+n-1)n}{2} ,由于2s一定为偶数,那么 2 a + n 1 2a+n-1 和n肯定不可能都为奇数。那么是否有可能两个都是偶数呢?我们假设n为偶数,那么 2 a + n 2a+n 一定为偶数,即 2 a + n 1 2a+n-1 为奇数。如果假设n为奇数,那么可以得到 2 a + n 1 2a+n-1 一定为偶数。总结起来就是,s一定会有一个奇数因子,而 2 n 2^n 是一定不含奇数因子的。
1-9
记住 \prod 为连乘符号后这个题就很简单,连乘matlab的函数为prod,用法和sum求和函数类似

clc;clear;
n=input('请输入一个数n:');
mul=1;
for i=1:n
    mul=mul*(1+1/i);
end
mul

1-10
先阶乘后累加,阶乘可用函数factorial

clc;clear;
n=input('请输入一个整数n:');
s=0;
for i=1:n
    s=s+factorial(i)/(2*i+1);
end
s

1-11 求解n次多项式方程的解:root函数
(用solve也可以,但是root更好)

clc;clear;
a=[3 4 7 2 9 12];
x=roots(a)

1-12求解n元一次方程组:用solve函数求解

%写法一:
clc,clear;
syms x1 x2 x3 x4
[x1,x2,x3,x4]=solve('x1+x2-3*x3-x4=1','3*x1-x2-3*x3+4*x4=4','x1+5*x2-9*x1-8*x4')

上面这个写法在新版本的语法貌似出了点问题,如果在新版本的matlab里会报错,写法二就不会
下面是官方文档的解释,翻译过来就是字符串输入向量这种方法已经被移除了。

%写法二:
clc,clear
syms x1 x2 x3 x4;
[x1,x2,x3,x4]=solve([x1+x2-3*x3-x4==1,3*x1-x2-3*x3+4*x4==4,x1+5*x2-9*x3-8*x4==0])

1-13
了解求导函数dff的用法

clc;clear;
syms x;
f(x)=(tan(x)+sin(x))^2;
diff(f(x))

1-14
了解求积分的函数int,这里最好加上一个常数C

clc;clear;
syms x C
f=(x^2+1)/(x^2-2*x+2)^2;
I=int(f)+C

1-15
同上

clc;clear;
syms x C
f=sin(x)*sin(x);
I=int(f,0,inf)+C

1-16
这个大矩阵看似很麻烦,实际上可以由四个10*10矩阵拼凑而成
即一个全0,一个全1,还有两个对角线和上半角均相同,区别是一个下半角是全1矩阵,另外一个则为全0矩阵。
( 10 0 0 0 1 20 0 0 1 1 1 100 ) ( 0 0 0 0 0 0 0 0 0 0 0 0 ) \begin{pmatrix} 10 & 0 & 0 & \cdots &0 \\ 1 & 20 & 0 & \cdots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & 1 & 1 & \cdots & 100 \\ \end{pmatrix} \begin{pmatrix} 0 & 0 & 0 & \cdots &0 \\ 0 & 0 & 0 & \cdots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0 & \cdots & 0 \\ \end{pmatrix}
( 10 0 0 0 0 20 0 0 0 0 0 100 ) ( 1 1 1 1 1 1 1 1 1 1 1 1 ) \begin{pmatrix} 10 & 0 & 0 & \cdots &0 \\ 0 & 20 & 0 & \cdots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0 & \cdots & 100 \\ \end{pmatrix} \begin{pmatrix} 1 & 1 & 1 & \cdots &1\\ 1 & 1 & 1 & \cdots & 1 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & 1 & 1 & \cdots & 1 \\ \end{pmatrix}
理清楚之后,我们就开始拼凑,右边的两个矩阵很简单,不赘述。重点是左边的两个矩阵。对于对角线矩阵,有一个很重要的特征就是i==j。再特殊处理一下左上角的矩阵的下三角部分。对于下三角,矩阵的角标满足i>j的关系。最后将四个矩阵按照对应位置拼凑即可 (极其像在搭积木)

clc;clear;
a=zeros(10,10);
b=zeros(10,10);
c=zeros(10,10);
d=ones(10,10);
k=1;
for i=1:10
    for j=1:10
        if i==j
            a(i,j)=k*10;
            c(i,j)=k*10;
            k=k+1;
        elseif i>j
            a(i,j)=1;
        end
    end
end
s=[a b;c d]
发布了13 篇原创文章 · 获赞 1 · 访问量 447

猜你喜欢

转载自blog.csdn.net/amino_acid0617/article/details/104280356