MATLAB基础例题一(附源码注释)

例1  分别求一个四位正整数的各位数字再求和。

% 例题一:分别求一个四位正整数的各位数字再求和
ms = 3456 ;
ms1 = rem(ms, 10); % 求个位数字
ms2 = fix(rem(ms, 100)/10); % 求十位数字
ms3 = fix(rem(ms, 1000)/100); % 求百位数字
ms4 = fix(ms/1000); % 求千位数字
sum1 = ms1 + ms2 + ms3 + ms4; % 求和
disp(sum1); %输出

例2  求[1, 100]区间内的所有素数。

% 求[1, 100]区间内的所有素数。
f1 = linspace(1, 100, 100); % 生成行向量f1
y1 = isprime(f1); %判断素数
y2 = find(y1); % 找到素数下标
prime_m = f1(y2); % 生成素数向量
disp(prime_m); % 输出

例3  计算表达式 (12*y + cos(34)sin(89))/(10 + |34 - 6i|*x) 其中 x = 7^(1/2) - 2i ,y = e^(pi/2)。

% 计算表达式 (12*y + cos(34)sin(89))/(10 + |34 - 6i|*x) 其中 x = 7^(1/2) - 2i
% y = e^(pi/2)。
x = sqrt(7) - 2i; 
y = exp(pi/2); % 表示x , y ,其中i,pi为预定义变量
x1 = cosd(34)*sind(89); % 用度表示时加d ,表示复杂量
x2 = 12 *y; 
y0 = 34 - 6i;
y1 = abs(y0); %求复数的模
y2 = y1*x;
result = (x2 + x1)/(10 + y2);
disp (result);

例4  矩阵A = (x1;x2),当x1为0.1, 0.3,0.5; x2为0.3, 0.4,0.5时分别求y = sin(A)*cos(A)的值。

% 例矩阵A = (x1;x2),当x1为0.1, 0.3,0.5; x2为0.3, 0.4,0.5时分别求
% y = sin(A)*cos(A)的值。
x1 = 0.1:0.2:0.5;
x2 = 0.3:0.1:0.5;  %建立向量x1,x2
A = [x1;x2]; %建立矩阵A
y = sind(A).*cosd(A); %.*是对应元素相乘,*为矩阵乘法
disp(y);


例5 水仙花数为各位数字的立方之和等于该数本身的三位正整数,求全部水仙花数。

% 例 水仙花数为各位数字的立方之和等于该数本身的三位正整数,求全部水仙花数。
s1 = 100:999;
s1_0 = rem(s1,10); %求个位数
s1_1 = rem(fix(s1/10),10); % 十位
s1_2 = fix(s1/100); % 百位
%k1 = find(s1 == power(s1_0,3) + power(s1_1,3) + power(s1_2,3)); 
k2 = find(s1 == s1_0.*s1_0.*s1_0 + s1_1.*s1_1.*s1_1 + s1_2.*s1_2.*s1_2);
% 获得水仙花数下标k1 , k2, 均可
k3 = s1(k2);
disp(k3);
 

例6  输入一个包含10个字符的字符串向量,并对该字符进行如下操作:

(1):取第1~5,第3~7的子字符串组成新的字符串向量

(2):统计字符串中小写字母的个数,数字个数,大写字母个数

(3):将字符串进行倒序排列

(4):将字符串中原大写字母变为小写,小写字母变为大写

(5):将字符串中的数字求和

%{
例 输入一个包含10个字符的字符串向量,并对该字符进行如下操作:
   (1):取第1~5,第3~7的子字符串组成新的字符串向量
   (2):统计字符串中小写字母的个数,数字个数,大写字母个数   [48,65,97]
   (3):将字符串进行倒序排列
   (4):将字符串中原大写字母变为小写,小写字母变为大写
   (5):将字符串中的数字求和
%}
%(1):
Aim_char = input('请输入任意十个字符','s');
aim1 = Aim_char(1:5);
aim2 = Aim_char(3:7);
New_char = [aim1;aim2];
disp(Aim_char);
%(2) (4) (5):
e = [0,0,0,0];
for item = 1:10
    if (97 <= Aim_char(item))&&(Aim_char(item) <= 122)
        e(1) = e(1) + 1; %统计小写字符
        Aim_char(item) = char(Aim_char(item)-32);%将小写字符转换为大写
    elseif (48 <= Aim_char(item)) &&(Aim_char(item) <= 57)
        e(2) = e(2) + 1;%统计数字字符
        e(3) = e(3) + (Aim_char(item) - '0'); % 字符串中数字求和
    elseif (65 <= Aim_char(item)) &&(Aim_char(item) <= 90)
        e(4) = e(4) + 1;%统计大写字符
        Aim_char(item) = char(Aim_char(item) + 32);%将大写字符转换为小写
    end
end
disp(e);
disp(Aim_char);
% (3):
new_char1 = reverse(Aim_char); % new_char1 = Aim_char(end:-1:1)
disp(new_char1);
strrep(Aim_char, aim1,aim2);%将Aim_char中所有的aim1字符串替换为aim2;
disp('替换之后为:    ');
disp(New_char);

例7 产生6阶随机三位数整数矩阵A,服从均值为0.78,方差为0.5的服从正态分布的6阶随机矩阵B,6阶单位阵I,5阶范德蒙矩阵C,5阶魔方阵D:

(1)验证(A + B)I = IA + BI;

(2)求C/D的值;

(3)求D的转置矩阵;

%{ 
例 产生6阶随机三位数整数矩阵A,服从均值为0.78,方差为0.5的服从正态分布的6阶
随机矩阵B,6阶单位阵I,5阶范德蒙矩阵C,5阶魔方阵D:
  (1)验证(A + B)I = IA + BI;
   (2)求C/D的值; 
   (3)求D的转置矩阵;                                                           
%}
A = fix(100 + 900*rand(6));
B = (0.78 + sqrt(0.5)* randn(6));
I = eye(6);
V = [1, 2, 3, 4, 5];
C = vander(V); D = magic(5);    % 产生以上矩阵
%(1):
if_equal = (((A + B) * I) == (I * A + B * I)); % 判断表达式是否相等
disp(if_equal);
%(2)
ans_re = (C / (D)); % 求C右除D的值
disp(ans_re);
%(3)
d_t = (D.');% 求D的转置矩阵
disp(d_t);


例8   生成8阶魔方阵,6阶帕斯卡矩阵,7阶希尔伯特矩阵求:

(1)魔方阵每行每列元素之和;

(2)验证帕斯卡矩阵的旋转矩阵的元素也为整数;

(3)希尔伯特矩阵的伴随阵,逆矩阵;

%{
例 生成8阶魔方阵,6阶帕斯卡矩阵,7阶希尔伯特矩阵求:
(1)魔方阵每行每列元素之和;
(2)验证帕斯卡矩阵的旋转矩阵的元素也为整数;
(3)希尔伯特矩阵的伴随阵,逆矩阵;
%}
a = magic(8); b = pascal(6); c = hilb(7);% 生成魔方阵,帕斯卡矩阵,希尔伯特矩阵
%(1):
sum_r = sum(a(item,:)); %行元素之和
sum_c = sum(a(:,item));% 列元素之和
disp(sum_r); disp(sum_c);
%(2):
format rational;  % 设置输出格式为有理数;
p_rot = rot90(b,2); % 求旋转矩阵
disp(p_rot); %输出
%(3)
%c_e = compan(c); %求伴随阵
c_i = inv(c);% 求逆矩阵
disp(c_i);

    


 例9:求任意m阶方阵的值

%例:求任意m阶方阵的值
user_in = input('请输入一个正整数');
user_mat = fix(100 *rand(user_in));%生成两位随机数矩阵
user_matn = triu(user_mat,0);%生成上三角阵也可利用tril(user_mat)生成下三角阵
user_result = sum(diag(user_matn,0));
disp(user_result);
% 以上利用矩阵变换求矩阵值得到标量值
disp(det(user_mat))  %det函数可求方阵值得向量值

例10 :建立n阶魔方阵Mag后完成以下操作,

(1):将每行元素分别乘以对角阵元素,将每列元素分别乘以对角阵元素

(2):求解线性方程组(Mag*x = Dig)

(3):验证主副对角线元素之和相等

%{
例:建立n阶魔方阵Mag后完成以下操作,
(1):将每行元素分别乘以对角阵元素,将每列元素分别乘以对角阵元素
(2):求解线性方程组(Mag*x = Dig)
(3):验证主副对角线元素之和相等
%}
Mag_i = input('请输入一个正整数');
Mag = magic(Mag_i); %创建魔方阵
%(1):
disp('(1)');  Dig = diag(1:Mag_i); 
Mag_r = Dig * Mag;  disp(Mag_r); %行相乘
Mag_c = Mag * Dig;  disp(Mag_c);% 列相乘
%(2)
disp('(2');   x = Mag\Dig ; disp(x); %左乘用右除 inv(Mag)*Dig
%(3)
disp('(3)'); sum_z = sum(diag(Mag));%求主对角线元素之和
Mag_f = flipud(Mag); sum_f = sum(diag(Mag_f));%翻转后求副对角线元素之和

例11 :求3到20阶魔方阵的秩,2到20阶希尔伯特矩阵的第二范数下的条件数,并绘制相应图形观察

%求3到20阶魔方阵的秩,2到20阶希尔伯特矩阵的第二范数下的条件数,并绘制相应图形观察
for i = 3:20
    magic_i = magic(i);   %生成魔方阵
    r(i) = rank(magic_i);  %求秩
end
subplot(2,1,1); %分割窗口
bar(r); %绘制条形图
axis([1,25,0, 25]);  %设置坐标轴
title('魔方阵的秩','FontSize',24,'color','b'); %设置标题
grid on;  %网格线
for u = 2:20
    hilb_u = hilb(u); %生成希尔伯特矩阵
    c(u) = cond(hilb_u,2);
end
subplot(2,1,2);
bar(c);
axis([1,30,0,30]);
title('希尔伯特矩阵的条件数','FontSize',24,'color','r');
grid on;

 例12:已知大写字母M的各个节点坐标如下表

(1):绘制M的图形

(2):若A=[1,0.5;0,1],利用A对M的坐标进行变换绘制变换后的图形

x00.50.530.50.56630
y0060600818
%例12
A = [0,0.5,0.5,3,5.5,5.5,6,6,3,0;0,0,6,0,6,0,0,8,1,8];%据表建立坐标矩阵
%(1):
subplot(3,1,1);
box off;
fill(A(1,:),A(2,:),'s');%绘制M,并填充同plot
%(2):
b = [1,0.5; 0,1];
y = b * A;
subplot(3,1,2);
box off;
fill(y(1,:),y(2,:),'s');%绘制变换后的M
%测试代码
N = [1,1,6,6,0,0,6,6;0,8,0,8,0,10,2,10];
subplot(3,1,3);
box off;
fill(N(1,:),N(2,:),'s');

例13 某次数学测试学生成绩在[0,50]为差,[51,75]为良,[76,100]为一般,[101,120]为优,编写程序输入学生成绩,输出学生成绩等级。

% 例:某次数学测试学生成绩在[0,50]为差,[51,75]为良,[76,100]为一般,[101,120]为优,编写程序输入学生成绩,输出学生成绩等级。
stu_g = input('输入您的本次成绩');
switch round(stu_g)
    case num2cell(0:50)  % 将数值矩阵转换为单元矩阵/将数组转换为元胞数组
        disp({stu_g, '成绩等级判定为差'});
    case num2cell(51:75)
        disp({stu_g, '成绩等级判定为良'});
    case num2cell(76:100)
        disp({stu_g,'成绩等级判定为一般'});
    case num2cell(101:120)
        disp({stu_g,'成绩等级判定为优'});
    otherwise
        disp('请检查您的输入重试!!');
end

例14 :从键盘输入若干个数当输入数字为2时结束输入并求这些数的平均值及和


% 例 从键盘输入若干个数当输入数字为2时结束输入并求这些数的平均值及和
user_x = input('enter a number(end in two)');
if user_x == 2
    disp('program over!!');
end

count = 0 ; mysum = 0;
while user_x ~= 2
    count = count + 1 ;
    mysum = mysum + user_x;
    user_x = input('enter a number(end in two)');
end
if count ~= 0
    average = mysum.\count;
end
format long
disp({mysum, average});

例15 已知y = f(40)/(f(30)*f(20)),分别用函数文件和匿名函数描述f(n):

(1)当f(n) = n + n*ln(n^3 + 5)时,y的值为多少;

(2)当f(n) = 1 * 2 + 2 * 3 + …… n * (n + 1)时,y的值为多少;

%{
已知y = f(40)/(f(30)*f(20)),分别用函数文件和匿名函数描述f(n):
(1)当f(n) = n + n*ln(n^3 + 5)时,y的值为多少;
(2)当f(n) = 1 * 2 + 2 * 3 + …… n * (n + 1)时,y的值为多少;
%}
f1 = @(n) n + n*log(power(n,3) + 5);  %匿名函数 log默认为自然对数
f2 = @one;  %句柄运算符重命名函数文件为f2;
y1 = f1(40)/(f1(30) * f1(20));  % 求值
y2 = f2(40)/(f2(30) * f2(20));
format rat
disp({y1,y2});

%新建函数文件one.m,将以下代码加入
function y = one(n)
y = 0;
for item = 1:n
    y = y + item * (item + 1);
end
return


例16 求解线性方程组 (1)直接法:

%(1): 利用左除运算
A=[1,2,-2;1,1,1;2,2,1]; %建立系数矩阵
b=[9;7;6]; %常数项向量
x = A \ b;  %左除等价于求逆后相乘
disp(x);
%(2) : 利用LU分解系数矩阵
[L, U,P] = lu(A);  %PAx = Pb  -> LUx = Pb ->x = ……
x1 = U \ (L\(P*b)); 
disp(x1);

(2)迭代法(a:雅可比迭代,b:高斯——赛德尔迭代)

a:Jacaobi迭代函数文件

function [x_solve, count] = jacobi(A,b,x_s0,ep)
D = diag(diag(A)); %求得依系数矩阵主对角线元素构成的单位阵
L = -tril(A,-1);  % 求得系数矩阵的下三角阵并取反
U = -triu(A,1);   %求上三角阵取反
B = D\(L + U);   % 依据y = Bx0 + f迭代式构造B,F
f = D\b;
count = 1;   % 记录迭代次数
x_solve = B*x_s0 + f;  %迭代表达式

while (norm(x_solve - x_s0) >= ep)
    x_s0 = x_solve ;
    x_solve = B*x_s0 + f;
    count = count + 1;
end
return

 b:GauSerDel迭代函数文件

function [y,count] = Gausseder(A,b,x0,ep)
D = diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
B = (D-L)\U;
f = (D-L)\b;
y = B*x0 + f;  % 迭代表达式中系数发生改变
count = 1;

while(norm(y - x0) >= ep)
    x0 = y;
    y = B*x0 + f;
    count = count + 1;
end
return

c:迭代调用文件

A=[1,2,-2;1,1,1;2,2,1]; 
b=[9;7;6];
[x,n]= jacobi(A,b,[0;0;0],1.0e-6);  %调用雅可比迭代求解线性方程组
disp({x,n});
disp(x);


例17 求lamda为何值时线性方程组有解

%{
对于齐次线性方程组Ax=0;当rank(A)<n -> 未知数个数,或|A| = 0,时方程有非零解
%}

syms lamda;
A = [1-lamda,-2,4;2,3-lamda,1;1,1,1-lamda];
resu = det(A); %求矩阵行列式的值
disp(simplify(resu)); % 简化结果多项式并输出
disp(factor(resu)); % 输出因式分解后的行向量求lamda的值为多少时行列式值为零

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值