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 一定要动手才行,不能光看。多想、多思考、多尝试,才是正路。