matlab基础

Matlab命令使用

  • matlab是一个计算工具,也是一种编程语言

基本计算操作

  • +
  • -
  • *
  • %
  • ^ 表示乘方, 5^2 五的二次方
  • log 代表的是自然对数 ln
  • log2 代表的是以2为底数的一个函数
  • log10 代表的是以10为底数的一个函数
  • 想要计算其他的对数,用换底公式:log8 7=log(7)/log(8)

基本界面操作

  • clc 清空屏幕中的所有内容

variable 变量

  • 变量是暂时用来保存变量的地方

在工作区可以看出来现在表中有哪些变量

矩阵运算

  • 用x=[]表示一个数组/向量(vector)
  • x=[1,2,3] ;
  • y=[5,6,7];
  • x+y = [6,8,10];
  • 如果x,y的维度不相同,那么x与y无法相加
  • 通过用分号来实现矩阵中的换行
  • x= [1,2,3;4 5 6];实现的就是两行三列的矩阵
  • 做矩阵乘法,直接可以用AXB,但前提两个矩阵是要满足矩阵乘法的条件
  • 做矩阵的几次幂也可以直接用 ^ 实现、

script 脚本

  • 新建脚本后,可以保存在一个固定的文件夹内,每当打开运行后,命令行窗口就会显示答案

几个小细节需要注意

  • 注意% 是单行注释;%{ %}是多行注释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
x = 5
y = 7
x+y
%注意,如果没有写分号的话,每一行都会输出ans值,等于每一行都认为你已经结束了操作
ans =

12

>> matlab

x =

5


y =

7


ans =

12
%上面的代码的运行结果就是这样
%如果行末有分号的话,就不会输出ans值,但x,y 的值仍然存在且运算 ,只是不会显示,等于认为你还没有完成脚本的操作
%如果打了分号,我们还需要看x的值,只需要打入 x = 就可以了

>> matlab

ans =

12

同时,利用脚本我们还可以进行交互,比如说

1
2
3
4
5
6
7
8
9
10
11
12
13
14
% 我在脚本里写了这句话以后,运行脚本,我们会得到以下结果
x = input('Please enter x:')

%------------------------结果----------------------------
Please enter x:234

x =

234

%也就是说,相当于C++中的 这种操作
cout<<"Please enter x: ";
cin>>x;
cout<<x;

现在我们用matlab脚本实现一个简单的相加函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%脚本内容
x = input('Please put in the x ;');
y = input('Please put in the y :');
x+y
%这里我前两句用了分号,因为不想输出x的值,但是Please XXXXXXXX 仍然会显现
%如果打了分号,那么在Please put in the x : 23 之后,会输出 x = 23;
%
%运行内容
>> add
Please put in the x ;12
Please put in the y :23

ans =

35

通过 fprintf函数,可以实现输出,

1
2
3
4
5
6
7
% C to F
C = input('Please putin a temperature in Celsius : ');
F = (C*1.8)+32;
fprintf('Fahrenheit = %.1f\n',F);
%其中,保留位数的写法和C语言一样,在% 后,f前面打 .1 .2 等
% 换行符也一样 是\n
%如果不想要这么多0,可以把数据类型换成%g,这样只会保留整数与小数部分

通过if语句,可以进行判断,注意,判断条件不用( )需要用end来表示范围

1
2
3
4
5
6
7
8
num = input('Please enter a number : ');
if num>0
fprintf('positive\n');
else
fprintf('negative\n');

%如果 num = 0,怎么判断,可以用 elseif(无空格)进行多语句判断
end

sqrt 函数求平方根

display函数,可以自动加\n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a = 10;
>> disp(a);
10
%----------------------------------
>> disp(['apple','banana','orange']);
applebananaorange
%---------------------------------------
>> disp(['apple ','banana ','orange ']);
apple banana orange
%---------------------------------------
fr1 = 'apple';
fr2 = 'banana';
fr3 = 'orange';
disp([fr1,' ',fr2,' ',fr3]);

循环可以用while 同样的 不需要( ),需要用end来表示循环范围

1
2
3
4
5
6
7
8
% 比如计算1 加到100;
i = 1;
sum = 0;
while i<=100;
sum = sum+i;
i = i+1;
end
disp(sum);

不等于在matlab中为~=

求余数在matlab中为mod函数

1
2
3
4
5
6
7
8
9
10
11
x = input('X is : ');
y = input('Y is : ');
%辗转相除法求最大公约数
temp =mod(x,y);
while temp~=0
x = y;
y = temp;
temp = mod(x,y);
end

fprintf ('最大公约数是 %g\n',y);

for循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for i = -5:5
disp(i);
end;
%如果中间的量不写,那么默认步长为1,既从小加到大
%如果中间的步长可正可以负,也可以为小数

for i = 5:-1:-5
end;

%上面就是 步长为-1的情况

v = [5 6 9 3 4 1 2]
for i =v
disp(i);
end
%这就相当于i 遍历v数组

sum(x) 函数求和

1
2
v = [5 6 9 3 4 1 2]
sum(disp(v));

matlab 画图功能

plot 函数 plot(x,y)

  • 注意,x,y不止两个数,而是两组数据,比如说
1
2
3
4
5
6
>> x = [1,2,3];
>> y = [4,5,6];
>> plot(x,y)
%画图的时候会一一对应,2-4;3-5;4-6;
%如果把y 改成了[4,6,7]
%plot(x,y)就变成了一条折线了
  • 注意,在画曲线的时候注意的小细节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>> x = -10:0.1:10;
>> y = x.^2;
>> plot(x,y)
>> y = x^2;
错误使用 ^ (line 51)
用于对矩阵求幂的维度不正确。请检查并确保矩阵为方阵并且幂为
标量。要执行按元素矩阵求幂,请使用 '.^
% 是一个方阵,矩阵求幂需要 点乘 用 y = x.*x 或者y = x.^2

------------------------------------------------------
>> x = -10:0.1:10;
>> y = x.^2;
>> plot(x,y,'green-o')
%这个-o的作用就是说,每个点用一圈把他标出来
% green其实是线的颜色
-------------------------------------------------
axis equal 命令是让x,y的单位长度相等

bar 函数画柱状图

1
2
3
4
5
>> y = [76,29,378,012,182,2870];
>> x = 2000:2005;
>> bar(x,y)
%这样画出来的图像就是以x为下标,y为柱值得柱状图
%如果不写x,直接写bar(y)下标从1开始递增

三维图像的操作

基本函数和美观工具

shading指令

colormap指令

light光照指令

指定光照算法

camlight 相机光照

代码实现
1
2
3
4
5
6
7
8
9
close all;clear all;clc
[x,y,z] = sphere;
colormap(jet)
surf(x,y,z)
shading interp
axis equal
camlight
lighting phong
% 下面是效果图

camlight效果图

材质-反射属性

图形填充

三维曲线

  • 下面实现一个绕z轴上升的螺旋线
1
2
3
4
5
6
7
% x取 0 - 6pi 其实就是 三圈
>> theta = 0:pi/50:6*pi;
>> x = cos(theta);
>> y = sin(theta);
>> % z也要取301个点,和x,y 搭配
>> z = 0:300;
>> plot3(x,y,z)

三维曲面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
%上图是莫比乌斯圈
clc;clear;close all;
k = 50;
u = 0:pi/k:2*pi;
v = [-1,-0.5,0,0.5,1]
for j = 1:length(v)
for i = 1:length(u)
x(i,j) = (1+v(j)*cos(u(i)/2)/2)*cos(u(i));
y(i,j) = (1+v(j)*cos(u(i)/2)/2)*sin(u(i));
z(i,j) = v(j)*sin(u(i)/2)/2;
end
end
surf(x,y,z)
%如果想去掉网格线,可以加上shading flat

旋转柱面函数

1
2
3
4
5
6
7
8
9
10
11
12
13
%上面是旋转正弦曲面,
close all;clear all;clc
x = 0:pi/20:pi*3;
r = 5+cos(x);%半径
%cylinder中r为半径,60为网格数
[a,b,c] = cylinder(r,60);
%如果直接写cylinder(r)那么就是默认20格子
mesh(a,b,c)
%可以通过引入颜色图来美观化
surf(a,b,c)
shading interp
colormap(jet)
%效果如下

旋转球面函数 sphere

1
2
3
4
5
6
7
[x,y,z] = sphere;
mesh(x,y,z)
shading interp
axis equal
% mesh是网格线,surf是面,无网格线
%可以通过colormap()来美观球面
%sphere(n)中的n为网格数,可改边网格的疏密程度

立体图形的绘制

绘制正方体 - 利用patch函数
1
2
3
4
5
6
7
8
vertices = [0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1];
faces=[1 2 6 5;2 3 7 6;3 4 8 7; 4 1 5 8;1 2 3 4;5 6 7 8];
for i = 1:6
h = patch(vertices(faces(i,:),1),vertices(faces(i,:),2),vertices(faces(i,:),3),'g');
end
axis equal
colormap(jet)
view(3)

动画制作

项目1 动态正弦曲线
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
X= -2*pi:0.1:2*pi;
Y = sin(X);
h = plot(X,Y);%把整条曲线全部保存
%现在这个曲线只有两个周期,并没有移动
for i = 1:1000
X = X+0.01;
Y = sin(X);
set(h,'XData',X,'YData',Y)
drawnow;
% 往右移动1000次,每次移动0.01个单位
end
%如果不想让他停下来,可以
while true


end

%动画原理,,让原来的图像全部向右边移动一一个距离,再在图中画出来
项目2 动态弹簧曲线
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
theta = -10*pi:0.1:10*pi;
X = cos(theta);
Y = sin(theta);
Z = theta;
h = plot3(X,Y,Z);
%X,Y不需要动,只需要动Z的长度
axis([-2,2,-2,2,-10*pi,10*pi]);%固定坐标轴的单位
while true
for i = 1:100
Z = 0.98*Z;
set(h,'XData',X,'YData',Y,'ZData',Z);
drawnow
end
for i = 1:100
Z = Z/0.98;
set(h,'XData',X,'YData',Y,'ZData',Z);
drawnow
end
end
项目3 时钟模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
t = 0:pi/100:2*pi;
X = cos(t);
Y = sin(t);
plot(X,Y);
axis equal;
%hold on 命令是为了下面两张图不覆盖
hold on;
lineX = [0,1];
lineY= [0,0];
%这里的lineX ,lineY不是点,是映射,0-0,1-0,lineX代表x轴,lineY代表y轴,所以是(0,0),(1,0)两个点相连接,接下来该的也是改(1,0)这两个坐标的值
h = plot(lineX,lineY);
theta = 0;
while true
theta = theta+0.01;
lineX(2) = cos(theta);
lineY(2) = sin(theta);
set(h,'XData',lineX,'YData',lineY);
drawnow;
end
-------------本文结束,感谢您的阅读-------------