文档库 最新最全的文档下载
当前位置:文档库 › MATLAB基础与应用教程论文

MATLAB基础与应用教程论文

MATLAB知识论文

姓名:周捷

学号:1404043143

班级:电气1411

3

摘要:总结了学习MATLAB一学期的一些基础知识,充分体现了MATLAB功能强大,特别是绘图功能,能很容易的解决很多数学问题,既可以绘制二维图形,又可以绘制三维图形,功能齐全。

一、MATLAB学习点滴之简单解决非图形数学问题

(1)在1——500中,找出能同时满足用3除余2,用5除余3,用7除余2的所有整数;

a=1:500;

b=a(find(rem(a,3)==2));

c=b(find(rem(b,5)==3));

d=c(find(rem(c,7)==2));

disp('在1——500中,找出能同时满足用3除余2,用5除余3,用7除余2的所有整数:')

disp(d)

在1——500中,找出能同时满足用3除余2,用5除余3,用7除余2的所有整数:

23 128 233 338 443

可以看出MATLAB在解决某些数学问题上面,比其他语言具有更为方便简单的优势。

(2)[1,2,3,NaN,5,NaN,7,8,9,10]

如何将NaN以外的8个数加起来,然后求这8个数的平均数。

-----------------------------------------------------------------

>> a=[1 2 3 nan 5 nan 7 8 9 10];

>> b=a;

>> b(find(isnan(a)))=[]

b =

1 2 3 5 7 8 9 10

a=[1 2 3 nan 5 nan 7 8 9 10];

简洁些可以这样:

mean_a=mean(a(~isnan(a)))

由此可以看出MATLAB代码更为简洁。

二、MATLAB学习点滴之数组、矩阵问题

(1)我想知道如何把数组/矩阵各行元素逆序排列?

例如a=[1 2 3 4 5;11 12 13 14 15],

如何把它的元素逆序排列变成a1=[5 4 3 2 1;15 14 13 12 11]

----------------------------------------------------------------------------

FLIPLR Flip matrix in left/right direction.

FLIPLR(X) returns X with row preserved and columns flipped

in the left/right direction.

X = 1 2 3 becomes 3 2 1

4 5 6 6 5 4

See also FLIPUD, ROT90, FLIPDIM.

(2)比如说一个2*100的矩阵A,只有A[1][90]这个元素是非零的------------------------------------------------------------------------------------------------------------

可列举两种方法:

1 :

>> is=[1];

>> js=[90];

>> as=[100];

>> S=sparse(is,js,as)

S =

(1,90) 100

2:

>> S=spalloc(2,100,1);%2*100 matric with 1 nezeros elment

>> S(1,90)=100;

>> S

S =

(1,90) 100

由此可以看出MATLAB对数据,矩阵的一些处理也是相当方便的。

三、MATLAB学习点滴之二维绘图问题

plot ——最基本的二维图形指令

plot的功能:

plot命令自动打开一个图形窗口Figure

plot用直线连接相邻两数据点来绘制图形

根据图形坐标大小自动缩扩坐标轴,将数据标尺及单位标注自动加到两个坐标轴

上,可自定坐标轴,可把x, y 轴用对数坐标表示。

如果已经存在一个图形窗口,plot命令则清除当前图形,绘制新图形

可单窗口单曲线绘图;可单窗口多曲线绘图;可单窗口多曲线分图绘图;可多窗口绘图

可任意设定曲线颜色和线型

可给图形加坐标网线和图形加注功能

下例可画出一条正弦曲线:

close all; x=linspace(0, 2*pi, 100); % 100个点的x坐标

y=sin(x); % 对应的y坐标

plot(x,y);

小整理:MATLAB基本绘图函数

plot: x轴和y轴均为线性刻度(Linear scale)

loglog: x轴和y轴均为对数刻度(Logarithmic scale)

semilogx: x轴为对数刻度,y轴为线性刻度

semilogy: x轴为线性刻度,y轴为对数刻度若要画出多条曲线,只需将坐标对依次放入plot函数即可:

plot(x, sin(x), x, cos(x));

例如:在区间0≤x≤2 内,绘制正弦曲线y=sin(x)。

其程序为:

x=0:pi/100:2*pi;

y=sin(x);

plot(x,y)

一次画出多条曲线:

将 x 及 y 坐标依次送入plot 指令

x = linspace(0, 2*pi); % 在 0 到 2 间,等分取 100 个点plot(x, sin(x), x, cos(x), x, sin(x)+cos(x)); % 进行多条曲线描点作图Plot(x,sin(x), x, cos(x), x, sin(x)+cos(x));

多窗口绘图:

例如:采用多窗口绘制正弦、余弦、正切、余切曲线在区间0≤x≤2 内的图形。程序如下:

x=0:pi/100:2*pi;

y=sin(x);

z=cos(x);

t=sin(x)./(cos(x)+eps);

ct=cos(x)./(sin(x)+eps);

H1=figure;

plot(x,y);

title('sin(x)');

axis ([0 2*pi -1 1]);

H2=figure;

plot(x,z);

title('cos(x)');

Axis([0 2*pi -1 1]);

H3=figure;

plot(x,t);

title('tangent(x)'); axis([0 2*pi -40 40]); H4=figure;

plot(x,ct);

title('cotangent(x)'); axis([0 2*pi -40 40]);

由上述几个简单的例子可见,MATLAB能够使各种数学函数直观的显示出其图像,由此不难推出,如果深入学习MATLAB必能解决生活中的许多问题。

四、MATLAB学习点滴之学习中遇到的一些问题

controlling legends的方法:

之前编写MATLAB中,关于怎么排除掉一些图线不显示其legend一直搞不懂,后来上网查询了其方法。从mathworks官网上发现了一个关于controlling legends的方法:

注意!!!!这个方法来源于MATLAB论坛:

图形对象的两个属性控制了legend的显示方式,一是annotation property,一是display name。其中,annotation property可以控制对象的图例是否显示、以群组形式显示或者显示子对象的图例。那么,论坛中有不少问题关于怎么排除掉一些图线不显示其legend,即可使用该属性,控制方式如下:

通过学习此方法,自己做个例子:

我们绘制几条曲线,然后控制有些显示图例,有些不显示:比如绘制正弦、余弦、指数以及衰减正弦,图例只显示正弦和指数。

代码:

x = -3.14:0.1:3.14;

y1 = sin(x);

y2 = cos(x);

y3 = .1*exp(x);

y4 = y1.*y3;

hold on

h1 = plot(x, y1, 'r');

h2 = plot(x, y2, 'g');

h3 = plot(x, y3, 'k');

h4 = plot(x, y4, 'm');

hold off

xlim auto

set(get(get(h2, 'Annotation'), 'LegendInformation'), 'IconDisplayStyle', 'off');

set(get(get(h4, 'Annotation'), 'LegendInformation'), 'IconDisplayStyle', 'off');

legend('sin', 'exp');

结果:

上述方法可能不是最好的解决方法,因为当想画出所有的legend后,把它重新排列成nXm,而不是一竖行,目前还没找到解决的办法。但是可以得出一个结论,MATLAB学习,不光是在课堂上听王老师说,课后还得上论坛看看,可以学习到很多知识和方法。

五、MATLAB学习点滴之学习MATLAB的乐趣

代码简化:

[No,Ns]=size(t);

[No,Ns]=size(y);

for i=1:No

sum_te=0;

for j= 1:Ns

sum_te=sum_te+abs((t(i,j)-y(i,j))/t(i,j)*100);% 序列t和y的相对误差绝对值之和

end

err(i)=sum_te/Ns;% 平均相对误差绝对值

end

---------------------------------------------------------------

[No,Ns]=size(t);

sa=sum(abs((t-y)./t*100),2);

sb=sa./Ns;

我个人觉得,学习一门语言,最大的乐趣肯定是能编出代码。编出代码之后能对其进行简化,更是其乐无穷。作为MATLAB初学者,我觉得在一个问题上进行反复推敲,必能进步,也能增加学习的乐趣。看着别人一大堆代码,而自己几行就能实现,而且功能相同,是件很愉快的事情。

MATLAB学习点滴之学习心得:

matlab跟其他语言不一样(我用的比较多的编程语言,除了matlab就应该是c或c++了,java也接触过,我想版面(matlab版)大部分人也差不多),如果你抱着“把其他语言的思想运用在matlab里面”的话,那么我想,即使程序运行不出错,也很难把握matlab的精髓,也就很难发挥matlab的作用了。

Matlab是一个基于矩阵运算的软件,这恐怕是众所周知的事情了,但是,真正在运用的时候(就是在编程的时候),许多人(特别是初学者)往往没有注意到这个问题,因此,for循环(包括while循环)满天飞…………..这不仅是暴殄天物(没有发挥matlab所长),还浪费了宝贵的时间。我这里想说的一点是,初学者往往在初始化矩阵的时候注意到这个问题,懂得了使用矩阵而不是循环来赋值,但是,在其他环节上,就很容易疏忽,或者说,仍然没有摆脱C++的思想。举个例子:

J = 0;

lt = size(imf1,2);

for (i = 1:lt)

if (abs(imf1(i)) > 1)

J = 1;

break

end

end

上面的代码实现了一个目的――检查信号imf1(一个向量)是否存在绝对值大于1的点,这显然是基于C++的思想写出来的。如果在matlab下面,其实用两个语句就足够了(当然,可以合并为一个):

q = find(imf1>1);

J = ~isempty(q);

这样的修改带来的好处是很可观的。

又如:

for j = 1:num

imf1(start1+j) = 2*li1(j+1) - imf1(start1+j);

end

这是一个对称翻折的问题,它完全可以用以下这个语句简洁表示:

imf1(start1+1:start1+num) = 2*li1(2:num+1) - imf1(start1+1:start1+num);

因此,如果是新手,可以先用循环(基于C++的思想)来编写代码,然后看看能否用matlab的语言(基于矩阵的思想)来改进。当然,这样做的前提是你对matlab提供的一些函数比较熟悉才行,这些函数在matlab的“帮助”那里搜索“Functions Used in Vectorizing”就可以找到一些,其他的也可以找相关的书籍。

课外想对提高matlab编程能力的方法,我想主要有以下三个:

1. 查help

2. 多上上论坛,搜索帖子、发帖子问人

3. 阅读别人、特别是牛人的程序

当然了,正如所有的程序语言一样,“3分课本7分上机”,若要学好MATLAB 一定要动手才行,不能光看。多想、多思考、多尝试,才是正路。

相关文档
相关文档 最新文档