matlab学习001-简单的矩阵输入运算及绘制信号曲线

目录

1,熟悉简单的矩阵输入

1.1,创建矩阵

1.2,在命令行调用文件中的变量

1.3,ones函数

1.4,who和whos的使用

2,绘制信号曲线 

2.1,实指数信号 

2.2,频率为50Hz的周期方波信号

2.3,信号卷积 *

2.4,产生从-4π到4π的Sa(t)函数

2.5,单位阶跃信号u(t)

2.6,g(t)=u(t)-u(t-1)

2.7,单位冲激信号δ(t)

1)stem函数

2.8,u(n-3)

2.9  冲击序列δ(n)

3,矩阵运算

1)A+5*B和A-B+I分别为多少?

①A+5*B

②A-B+I

2)A.*B

3)A*B

4)A.^B

5)A./B

6)A.\B


1,熟悉简单的矩阵输入

1.1,创建矩阵

在命令窗口输入矩阵A=[123;456;789]或A=[1,2,3;4,5,6;7,8,9]观察输出结果。

  

观察结果,可知:

经观察可以发现,在创建矩阵的时候如果不在每列数字中间加上逗号或者是空格,那么每一列都会很紧凑的挨在一起。如果不想要使用逗号的话,可以直接使用空格键,让每列分开。

用回车代替矩阵里面的分号,观察输出结果。

观察结果,可知:

输出依旧能够实现矩阵的样式,且更加方便,不用写分号。唯一不足就是定义矩阵的时候占用的行过多,不利于观察。我还是比较喜欢使用分号来分开每一行。

1.2,在命令行调用文件中的变量

选择Filenew菜单中的M-file,输入B=[9,8,7;6,5,4;3,2,1]

保存为B1.m文件,退出编辑环境。此时在命令窗口中使用B1命令就

可调出B矩阵。

需要注意的是,变量名和脚本名不能同名,不然就会无法识别。

如果B1.m文件不在project工程目录下,就会有如下结果:

这个时候可以直接使用window自带的拖拽功能,直接将文件拖拽到project目录下即可。

1.3,ones函数

输入x=ones(3,4),观察输出结果。

观察结果:

Ones有1的意思,在创建矩阵时,会用1来填充矩阵的所有行和列。

1.4,who和whos的使用

输入who和whos观察结果,了解其作用。

 观察结果并了解到其作用:

who只是简单的列出了同一个工程下所有文件的变量名。

whos相比于who列出的信息更详细,如:该变量的名字,大小,类型和所占的字节。

2,绘制信号曲线 

2.1,实指数信号 

%f(t)=3e-t;
%(t>0(取适当的△t)
dt=0.01;
t=0:dt:5;
y=3*exp(-t);
plot(t,y);

 产生3-e^(-t)的信号

%f(t)=3-e-t;
%(t>0(取适当的△t)
dt=0.01;
t=0:dt:5;
y=3-exp(-t);   % exp表示以常数e为底的指数函数
plot(t,y);

2.2,频率为50Hz的周期方波信号

dt=0.001;    % 采样间隔为0.001s
t=0:dt:1;
y=square(2*pi*50*t);
plot(t,y);
axis([0,0.1,-1.1,1.1]);
title('·½²方波');
xlabel('时间/s');
ylabel('幅度/db');
axis manual;

axis - 设置坐标轴范围和纵横比。此 MATLAB 函数 指定当前坐标区的范围。以包含 4 个、6 个或 8 个元素的向量形式指定范围。

2.3,信号卷积 *

%f(t)=e^(-t)  % 实指数信号
%sin(2лt)(0<t<3)
dt=0.01;
t=0:dt:5;
y=exp(-t).*sin(2*pi*t);  % exp表示以常数e为底的指数函数
plot(t,y);

2.4,产生从-4π到4π的Sa(t)函数

%f(t)=sa(t); 样本函数
%(t>0(取适当的△t)
dt=0.001;
t=-4*pi:dt:4*pi;
y=sin(t)./t;
plot(t,y);

2.5,单位阶跃信号u(t)

t=-1:0.01:3;
f=heaviside(t);
plot(t,f);
axis([-1 3 -0.1 1.2]);

在Matlab中,heaviside函数用于计算阶跃函数。这个函数以0为分界点,当函数的自变量小于0时返回0,当自变量等于0时返回0.5,当自变量大于0时返回1。例如,heaviside(2)返回1,heaviside(-3)返回0, heaviside(0)返回0.5。 

2.6,g(t)=u(t)-u(t-1)

依旧可以使用heaviside函数来生成u(t-1),如下👇 

t=0:0.01:3;
f1=heaviside(t);  % u(t)
f2=heaviside(t-1);% u(t-1)
g=f1-f2;          % u(t)-u(t-1)
plot(t,g);
axis([0 3 -2 2]);

 如果想要绘制u(t-2)的信号,可以用heaviside(t-2)。

2.7,单位冲激信号δ(t)

t = (-1:0.0001:1);  % 中间的0.0001是采样间隔,也可以理解为采样周期,采样周期越小,采样频率就会越大,得到的图像就越是我们想要的结果
impulse = t==0;     % 冲击信号只有在t=0时才有取值,其它部分值为0
plot(t,impulse);

1)stem函数

stem函数主要用于绘制离散序列,而plot用于绘制连续信号。如下,我先用stem函数来绘制离散的正弦信号,👇 

x=0:0.1:2*pi;
y=sin(x);
stem(y,"filled");

 对应的效果如下图:

 如果我用plot函数来代替stem函数,得到的就是下图:

2.8,u(n-3)

绘制u(x-3)延迟阶跃信号有两种方法,一种是使用heaviside函数,另外一种就是使用表达式,如下,都可以得到图中的信号图👇

t=0:0.001:6;
y=heaviside(t-3);  % 使用heaviside函数绘制阶跃信号
%y=(t>3);  % 阶跃信号只有在指定初始位置之后才有值,之前的值为0
plot(t,y);

如果觉得y轴太“矮”,想要自定义高度,也可以,我就需要使用到之前的axis坐标轴函数来设置x和y相应的坐标,如下👇

t=0:0.01:6;
%y=heaviside(t-3);  % 使用heaviside函数绘制阶跃信号
y=(t>=3);  % 阶跃信号只有在指定初始位置之后才有值,之前的值为0
plot(t,y);
axis([-1 6 0 2]);

如果想要离散的时间序列,可以将plot函数替换成stem函数,如下👇

n=0:0.001:6;
y=heaviside(n-3);  % 使用heaviside函数绘制阶跃信号
%y=(n>3);  % 阶跃信号只有在指定初始位置之后才有值,之前的值为0
%plot(n,y);
stem(n,y);  % 绘制离散序列

因为在对连续时间信号进行抽样时,我使用的是按照采样周期0.001来进行采样,所以,就会显示出有一个由无数多个单位冲击序列组成的单位阶跃序列,如果放大蓝色区域就可以看到无数多个冲击序列,如下图👇

如果不想要那么密集的显示,可以将采样周期删除掉,效果就会是如下图👇

2.9  冲击序列δ(n)

n=-1:3;
y=(n==0);
stem(n,y);

3,矩阵运算

给出下面三个矩阵

A=[4 12 20;12 45 78;20 78 136];

B=[1 2 3;4 5 6;7 8 9];
I=eye(1);  % 单位矩阵

eye(N),返回N*N大小的单位矩阵;
eye(M,N)、eye([M,N]),返回M*N的单位矩阵;
eye(size(A))返回和矩阵A一样大小的单位矩阵;
eye无参数时表示标量1
 

matlab有两种使用方式:一种是使用M文件,另一种是直接交互的命令行操作方式。交互式界面相对于M文件不需要每次运行保存,速度会更快,接下来的矩阵运算,转到命令行,如下👇。 

回答有关问题:

1)A+5*B和A-B+I分别为多少?

①A+5*B

②A-B+I

2)A.*B

3)A*B

官方给出的解释:

*  mtimes - 矩阵乘法

    此 MATLAB 函数 是 A 和 B 的矩阵乘积。如果 A 是 m×p 矩阵,B 是 p×n 矩阵,则 C 是通过以下公式定义的 m×n 矩阵:...

    C = A*B
    C = mtimes(A,B)

如果想要了解更多,请查看matlab的帮助文档,如下图👇

如果是一个序列一个数值p使用了*运算符,那么结果就是该序列变为了原来的p倍,如下👇

 

4)A.^B

matlab官方的解释:

.^  power - 按元素求幂

    此 MATLAB 函数 计算 A 中每个元素在 B 中对应指数的幂。A 和 B 的大小必须相同或兼容。

    C = A.^B
    C = power(A,B)

5)A./B

matlab官方解释:

. /  rdivide - 数组右除

    此 MATLAB 函数 用 A 的每个元素除以 B 的对应元素。A 和 B 的大小必须相同或兼容。

    x = A./B
    x = rdivide(A,B)

6)A.\B

官方解释:

.\ ldivide - 数组左除

    此 MATLAB 函数 用 A 的每个元素除以 B 的对应元素。A 和 B 的大小必须相同或兼容。

    x = B.\A
    x = ldivide(B,A)

有问题请在评论区留言或者是私信我,一天8h在线。

  • 14
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【课程简介】 本课程适合所有对MATLAB感兴趣的同学,通过本课程,你将学习到如何使用MATLAB,让你深入了解MATLAB的强大。 【完整课程列表】 MATLAB程序设计教程 MATLAB与高等数学 MATLAB与科学计算(共166页).ppt MATLAB程序设计教程 MATLAB与高等数学 第01章 MATLAB操作基础(共33页).ppt MATLAB程序设计教程 MATLAB与高等数学 第02章 MATLAB矩阵及其运算(共78页).ppt MATLAB程序设计教程 MATLAB与高等数学 第03章 MATLAB程序设计(共48页).ppt MATLAB程序设计教程 MATLAB与高等数学 第04章 MATLAB文件操作(共12页).ppt MATLAB程序设计教程 MATLAB与高等数学 第05章 MATLAB绘图(共63页).ppt MATLAB程序设计教程 MATLAB与高等数学 第06章 MATLAB数据分析与多项式计算(共36页).ppt MATLAB程序设计教程 MATLAB与高等数学 第07章 MATLAB解方程与函数极值(共28页).ppt MATLAB程序设计教程 MATLAB与高等数学 第08章 MATLAB数值积分与微分(共14页).ppt MATLAB程序设计教程 MATLAB与高等数学 第09章 MATLAB符号计算(共23页).ppt MATLAB程序设计教程 MATLAB与高等数学 第10章 MATLAB图形句柄(共13页).ppt MATLAB程序设计教程 MATLAB与高等数学 第11章 MATLAB图形用户界面设计(共18页).ppt MATLAB程序设计教程 MATLAB与高等数学 第12章 Simulink动态仿真集成环境(共33页).ppt MATLAB程序设计教程 MATLAB与高等数学 第13章 在Word环境下使用MATLAB(共18页).ppt
matlab离散点连成的两曲线的交点-intersections.m 本帖最后由 kastin 于 2012-12-29 11:47 编辑 引言     曾经思考过曲面求交,结果发现是学术界的一个难题,并且也想出了一个当前广泛使用方法原理一样的近似解(追踪)。当然网上也有很多方法,只不过那些方法非常粗糙,无非就是meshgrid出离散网格,比较两曲面在某位置的坐标是否在某一精度范围内,然后标记显示之。这个方法仅仅当离散网格非常细的时候才比较精确。除此之外,还有个非常严重的问题:上面的“精度范围”不是你随心所欲给的,而且也没规律寻找,当给得不恰当的时候,在格点处两曲面点作比较,会出很多个符合要求的点,或者一个也没有。这样就会使得交线非常曲折,甚至断裂等,严重影响精确度。 ———————————————————分割线————————————————————————     当然,既然有曲面求交,那么也有曲线求交,其基本结构就是两曲线求交。只是曲线求交问题,事先得澄清一些注意点:     1. 数学分析层面求两曲线交点,其实就是方程组求解;     2. “曲线”概念包括“直线”(处处曲率半径为无穷大);     3. Matlab的重点是离散点 矩阵运算,因此所有运算都是基于离散的,因而这里的曲线并不是绝对光滑的。     4. 近似试探与未知函数表达式。 对于1,我想说的是,如果你想要求得两曲线的精确交点,并且一个不漏,那就直接求解方程组,不用看本帖下文; 对于2,直线在Matlab里面是两个点确定,因此交点如果是一段线(无穷个点)的情况,可能只是显示两端点为交点; 对于3,很简单的例子,参数方程 x=cos,y=sin 在数学分析(即连续空间)层面上是个圆,但是如果你在离散t的时候,间距比较大,那么最后Matlab绘制的图像不是圆,而是正多边形了。因此,此时我们讨论曲线交点是这个离散点连线的图形与其他图形的交点,而非圆与其他交点。这也是我在标题中加了“离散点连成”的修饰词,防止被误会。 对于4,既然是求曲线交点,那么本方法可以作为求方程组的近似解。当然,如果离散点够多,解的精确度可以保证,不过不能保证一个不漏。另外就是,对于一组离散点构成的曲线,很难知道它们的解析表达式,因此想通过非线性方程组求解的方法来求交点,就不大可能了(不过你可以用曲线拟合出函数解析式),因此,本帖的方法将会是一个较为有效求交点的方法。     废话了那么多,下面就说说曲线求交点的方法吧。除了求解方程组,很多人想到的方法就是“离散点 判断距离是否足够接近”,这个方法原理跟引言中曲面求交的方法是一样的。因此缺点也是一样的——太粗糙了。网上这种方法的代码也很多,这里就不上了。 下面将阐述我的方法以及给出例子代码。     我有两种思路,一种是高级绘图层面的(不涉及到底层操作),一种是底层的。我只给出了第一种的代码,因为我不会底层操作。     思路一:既然matlab曲线绘图是通过有序离散点依次连线形成,也就是说,通过“以直代曲”的过程,那么曲线交点无非就是离散点(结点)或者两线段交点。这比上面直接用交点附近的结点替代交点的方法要精确得多了。而两直线交点很容易求,只要知道四个点坐标,那么交点精确坐标自然可以表示出来。这就是求交点的原理。只是还有一些细节处理和要注意的地方,我会留到后面再详细说。     思路二:仔细观察两曲线交点的特性,很容易发现,其实交点就是操作系统底层绘图重叠的那些像素点。因此,只要给要绘制的像素点做个标记,将那些重合的点突出显示(比如换个颜色),那么就相当于显示出交点了。这种方法由于是本质性的,因此不会遗漏任何交点,而且精确度极高,适用范围广。Matlab提供的plot plot3 surf等绘图函数都属于高级绘图,底层绘图(或称低级绘图)只有line surface以及patch等少数函数。但是,这里的“底层”并非真正的底层,因为它还是经过封装了的,而C 的MFC里面直接用刷子绘图,那才是依靠操作系统完成的真正的“底层”绘图操作(包括所有窗口都是操作系统绘制的)。这里扯远了,想要说明的就是底层绘图的概念而已。只是我不会用matlab实现这些底层绘图。     上面说了思路,下面就详细说说一些注意点和需要处理的细节。     为了算的健壮性,就必须考虑各种奇异的情况,防止bug。我们要考虑曲线有分支(很多代数曲线是这样的,代数几何里面研究的东西)、间断跳跃(有绝对值函数或者存在渐近线情况)、首尾是交点、在切点相交,等等这些情况。而且对于定位交点处附近的四个最近端点也是个问题(因为这里存在一个情况,如果曲线1上的一条线段与曲线2上的两条或者以上的线段相交,我的程序因为这个问题没能有效解决,出现在一些非常特殊的情况下会遗漏部分交点)。上面的情况如果不考虑,那么你的程序就会出现各种各样的问题。     对于通常情况,我考虑使用变号则来判断交点(也就是高数里面“连续函数变号端点内存在零点”),对于上面说的特殊情况,那么预先处理,比如先看是否存在eps内的,或者为零的结点,有则直接记录,没有的话,通过两线段求交来确定交点。至于遍历顺序的问题,为了简便,我指考虑两曲线离散点个数相同的情况(因为不同的话,会出现一些无处理的情况),而且优先考虑离散点的坐标值中x或者y都相同的情况(比如x=0:0.1:pi; y1=sin, y2=x.^2这两条曲线的x值相同分布)。 下面是曲线y=cos.*exp)与y2=sin.^2 cos在[0:pi/18:2*pi]区间内的交点的代码: 注意:我没有写成接口的形式,虽然对于比那些较懒的人来说不太方便,但是这样做是为了让你能更好弄懂原理,并能自己改造代码。因此,下面的代码可以稍作修改,就能解决别的曲线求交点。这样,不愿思考的懒人就没达到自己的目的了~% 绘制两离散曲线的交点 % 注意: %   1. 这里的“交点”指的是离散点连线绘出的图形的交点,而非函数或者方程理论分析上的交点, %      因此,这个程序不能作为求根来用。 %   2. 要求两曲线的离散点的个数一样。 %   3. 两个曲线出现参数方程的话,大多数情况正常。但是经测试发现,对于某些非常特殊的情况会出现bug, %      除非调用ezplot的数据(xdata,ydata)。 % %   by kastin @Mar 21, 2012 clear; debug=false; %关闭显示求交点过程 % 曲线1 x=0:pi/18:2*pi; y=cos.*exp); % 曲线2 [x1 N]=sort;  %此处对于C1参数方程,C2为显式函数;或者均为参数方程时候有用 % 下面几句代码在本个案下没有什么特殊作用,但是当出现参数方程的时候,下面的方法改动一下就会有用。 y1=sin.^2 cos; %用于作图 x2=x; y2=sin.^2 cos; %用于寻点 h=plot; y<=eps)=0; y20; neg=cy<=0; %确定变号位置 fro=diff~=0; %变号的前导位置 rel=diff~=0; %变号的尾巴位置 zpf=find; %记录索引 zpr=find 1; %记录索引 zpfr=[zpf; zpr]; hold on % 观看求交点过程 if debug, hp=plot,y,'r.-',x2,y2,'g.-'); end %线性求交 x0=.*-y)-x.*-y))./ y2-y-y2); y0=y ).*-y)./-x); if any), y0=y2; end %加入已经判断为零的位置 x0=[x<=eps) x0].'; y0=[y<=eps) y0].'; hc=plot; %绘制交点 if debug, legend;hp],'C1','C2','交点','微线段1','微线段2',0); end legend xlabel, ylabel, zlabel; title axis equal hold off disp disp) %排除重复的点复制代码经测试十几种奇怪的曲线相交(包括参数方程形式的曲线),目前发现上述代码的方法有四种情况会出现遗漏一两个交点。(其实上面代码本意是求显式函数的曲线交点,或者未知表达式的离散点曲线的交点,并未针对参数方程,隐函数方程做优化,但是可以凑合着用用。)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值