matlab的学习心得

MATLAB的学习体会

                                          姓名:陈燕民      

                                                            班级:11信息2班  

                                                            学号:201124093246 

经过一学期的c++的学习,我们开始转化学习Matlab软件的学习。学习Matlab软件应用是一次更高要求的学习计划,也是一种结合我们信息专业背景的规划。为此我感受到了老师的良苦用心!

首先我想说的是,matlab跟其他语言不一样(我用的比较多的编程语言,除了matlab就应该是c或c++了。) 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);

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

又如:

forj=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的“帮助”那里搜索“FunctionsUsedinVectorizing”就可以找到一些,其他的也可以找相关的书籍(没找到?不可能,电子版总可以下载到的)

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

1.查help

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

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

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

最后,整理一下常用的快捷键(用【】表示)或命令:

1.在命令窗口(CommandWindow)中:

1)【上、下键】――切换到之前、之后的命令,可以重复按多次来达到你想要的命令

2)clc――清除命令窗口显示的语句,此命令并不清空当前工作区的变量,仅仅是把屏幕上显示出来的语句清除掉

3)clear――这个才是清空当前工作区的变量命令,常用语句clearall来完成

4)【Tab】键――在[email]matlab@hit.edu.cn[/email]看到的:在command窗口,输入一个命令的前几个字符,然后按tab键,会弹出前面含这几个字符的所有命令,找到你要的命令,回车,就可以自动完成。目前讨论结果是:matlab6.5版本中,如果候选命令超过100个,则不显示。而在matlab7.0以后版本中,则没有这个限制,均可正常提示(我们用的就是7.0的,还是老师高明,佩服!)

5)【Ctrl+C】(或【Ctrl+Break】)――在matlab程序运行过程中,可能由于程序编写的失误,导致程序不停的运行,在命令窗口输入“Ctrl+C”可以将运行的程序停下来,而不需要将整个Matlab程序关掉。不过进行此操作的前提是能够激活切换到命令窗口才行,呵呵。

2.在编辑器(Editor)中:

1)【Tab】(或【Ctrl+]】)――增加缩进(对多行有效)

2)【Ctrl+[】--减少缩进(对多行有效)

3)【Ctrl+I】--自动缩进(即自动排版,对多行有效)

4)【Ctrl+R】――注释(对多行有效)

5)【Ctrl+T】――去掉注释(对多行有效)

6)【Ctrl+B】――括号配对检查(对版本6.5有效,但版本7.0无效,求老师指点,其他版本没有测试过)

7)【F12】――设置或取消断点

8)【F5】――运行程序

其余的例如在Debug状态下的快捷键就不多说了,自己看菜单Debug吧

Coming:

1.help:最有效的命令

其实,可以这样说吧,如果离开matlab软件,我想我自己是基本上什么都不会。一遇到什么问题,通常

我的第一反应是:help,就先说说自己对help的一些常用方法吧。

1)命令窗口直接敲“help”,你就可以得到本地机器上matlab的基本的帮助信息。

2)对于某些不是很明确的命令,只知道大体所属范围,譬如说某个工具箱,直接在命令窗口中敲入

Help toolboxname,一帮可以得到本工具箱有关的信息:版本号,函数名等。

3)知道函数名,直接用help funname就可以得到相应的帮助信息。

2.see also:不可小瞧的关联

在用help命令的时候,可能因为我们开始估计的方向不一定完全正确,在列出的帮助信息中没有直接

给出的我们要找的东西,但是我们一定不要忽略了在帮助的最后列出的see also。

譬如:曾经遇到一个画椭球的问题。刚开始我以为这个命令函数应该在graph3d中给出的(顺带提一句,

只用help的时候我们就可以看到matlab\graph3d-Threedimensionalgraphs.。

于是乎,我又help graph3d,很遗憾,在Elementary3-Dplots.中我没有发现画椭球的函数,但是

我发现在see also中有SPECGRAPH.抱着试试的态度,我又help specgraph,^_^,这次在Solid modeling中找到了ellipsoid-Generateellipsoid。

3.lookfor:matlab中的google

当我们很多什么头绪都没有的时候,我们可以求助于它,往往会收到意想不到的效果。

譬如:一个师兄说过在gui编程的时候,他遇到过这样一个问题:想拖动鼠标时,要出现一个方框,就像我们在桌面上拖动鼠标,会出现虚线框一样。当初我也刚开始一定都不知道该查找什么东西,后来想起用它了。于是乎,

>>lookforRectangle(很不好意思,当时这个矩形我还是在金山词霸中搞定的-_-)

。果然,在其中就找到

这样一条信息:GETRECTSelectrectanglewithmouse.^_^

4.Edit:查看m源文件的助手

在应用matlab过程中,可能我们想看看它的m源文件,当然用editor定位打开也行,但是我经常采用的是直接在command窗口中用edit funname.m,就省去了定位的麻烦。

5.其他常用命令:which,what等

which:定位指定的函数和文件,最好带上参数-all,以便显示更加多的信息

what:获得指定目录的m文件,mex文件以及mat文件名列表

6.各个高校bbs的mathtools版

谁都不可能什么都懂,但是永远记住这样一句话:Two heads are better than one.多向他人请教,多相

互讨论,这不只是在于解决matlab的问题上。

我最经常去的bbs有:

.瀚海星云([url]http://fbbs.ustc.edu.cn/[/url]的mathtools版

.水木清华([url]http://www.smth.edu.cn/ver2.html[/url]的mathtools版

.饮水思源([url]http://bbs.sjtu.edu.cn/[/url]的mathtools版(个人比较喜欢)

.紫丁香([url]http://bbs.hit.edu.cn/[/url]的matlab版

8.一些专业网站

我所知道的有:

1)[url]http://www.mathworks.com[/url]mathworks的官方网站

2)[url]http://www.mathtools.net/MATLAB/index.html[/url]这里有很多好的工具箱或者

小的辅助函数

可以下载,不过是国外的,e文和网络对来说感觉都是很不爽的事情。

3)[url]http://matlab.myrice.com/[/url]Matlab大观园,估计只要在网上搜索过matlab

资料的就不会不知道它,园主是东北大学的薛定宇教授,一直从事MATLAB语言及其应用研究。

4)[url]http://passmatlab.myetang.com/MATLAB/INDEX.HTM[/url]文宇工作室

5)[url]http://sh.netsh.com/bbs/5186/[/url]matlab语言与应用,薛定宇的一个论坛

6)[url]http://www.matwav.com/resource/newlk.asp[/url]中国学术交流园地,除了matla

b有关外,还有很多其他的专业的文章。

最后一条,要大胆的去试,哪怕只有一丁点儿可能。

最后,matlab只是一个很好的应用工具而已,也不像vc,delphi,vb等开发工具,最多的还是应用于算法的验证,仿真等。我们应该的是尽可能的知道一点儿基础的,然后熟悉本专业的toolbox。(可惜,我现在一直没有这样的实际应用机会)

  随着对技术的理解加深,有一些看法在逐步转变。以前以为一个好东西,总能够保持其优势。然而现实生活中,技术发展太块了,仅有这些还不够。不选择更新,只有被淘汰,无论是技术,还是做技术的人。

  MATLAB真是一个好工具,也只能是一个好工具。它可以作为一个平台,承载知识和算法,那么核心的竞争力将是它实现的技术和产品。现在的公司,主营业务是通信软件。以后的职业规划,将更多的与通信沾边了。又是一个陌生的领域,又是一个必须要全力以赴的专业。(窃喜,自己的专业貌似还好。)

  感谢MATLAB带给我的新思维,技术的路很漫长。回头只能看到自己的影子,希望明天有明媚的眼光!

 

第二篇:Matlab学习心得系列——003. 矩阵操作

003.矩阵操作

Matlab的基本数据元素就是矩阵,可以是2维、1维(向量)、3维或更多维。

一、 矩阵创建与表示

Matlab不用提前声明或定义变量,直接【起变量名、赋值、使用】(注1)。

1.特殊向量:(注2)

k = 1 : 1 : 10 % 创建行向量k,起始值1,步长1,终止值10

%默认步长是1, 即 k = 1 : 10

% 步长可以是负数(起始值>终止值)

运行结果:k = 1 23 4 5 67 8 9 10

2.一般矩阵:(字符串为元素的矩阵建议用元胞数组,下次内容)

A = [12,3;45,6] % 创建2行3列矩阵A, 矩阵大小不用预先定义 % 矩阵元素必须放在“[ ]”内

% 同行元素间用“, 或空格”隔开

% 行与行间用“;”隔开

% 矩阵元素可以是数值、变量、字符、函数表达式

运行结果:A=1 2 3

4 56

3.特殊矩阵:

ones(m,n)% 生成m×n维的全“1”矩阵

zeros(m,n) % 生成m×n维的全“0”矩阵

eye(m,n) % 生成m×n维的单位矩阵(多余的行或列全为0) diag(k或A) % 生成或提取对角矩阵

triu(A) % 提取矩阵A的上三角部分生成上三角矩阵

tril(A) % 提取矩阵A的下三角部分生成下三角矩阵

rand(m,n)% 生成m×n维的(0,1)区间均匀分布的随机矩阵

randn(m,n)% 生成m×n维均值为0,方差为1的标准正态分布随机矩阵 fiplr(A) % 矩阵A左右翻转

fipud(A) % 矩阵A上下翻转

fipdim(A,dim) % 矩阵A特定维度dim(1,2)翻转

sparse()% 生成稀疏矩阵

full() %将稀疏矩阵化为普通矩阵

4.矩阵的维度、大小、长度

A = [1 2,3;4 5,6];

a = ndims(A)% 返回矩阵A的维度(几维矩阵)

[I,J] = size(A)% 返回矩阵A各维度维数的大小(几行,几列)

L = length(A) % 返回矩阵A各维度维数的最大值(行数,列数的最大值) 运行结果:a = 2 I = 2 J = 3 L = 3

注:length() 通常用于测量向量的大小。

5. 矩阵拼接、扩充、变形

C = [A, B] % 水平拼接

C = [A, B] % 水平拼接

D = [A; B] % 垂直拼接

E = repmat(A,[1,2]) % 排成1×2的两块A,同 [A, A]

F = repmat(A,[2,1]) % 排成2×1的两块A,同 [A; A]

X = 1:24; % 1×24的一维行向量

reshape(X, 3,8); % 把X变形为3×8的二维矩阵

reshape(X, 3,8); % 把X变形为3×8的二维矩阵

二、矩阵元素的寻址和访问

1.访问2维矩阵(m×n)各元素的位置有两种方式:

①行列下标索引

A(i, j)——第i行,第j列的元素

②线性索引,也是矩阵存放元素的顺序,reshape()变形保持该顺序

A(1), A(2), ?, A(m*n)——元素依次取自第1列,再第2列,?? 故A(i, j) = A( (j-1)*m+i)

两种索引间的转换函数:

[I, J] = ind2sub( size(A), IND)

[IND] = sub2ind(size(A), I, J)

find() 函数常用来查找矩阵中满足一定条件的元素

A = [1 2,3;4 5,6];

ind = find(A>2);% 返回A中大于2的元素的线性索引值

[m,n] = find(A>2);%返回A中大于2的元素的行列下标索引值

[I, J] = ind2sub(size(A), ind) % 线性索引转行列下标索引 IND = sub2ind(size(A), I, J) %行列下标索引转线性索引 运行结果:I= 2 J = 1 IND = 2

2 2 4

1 3 5

2 3 6

2.用冒号“:”获取矩阵的一些元素

A(i, :)——矩阵A的第i行,所有列

A(:, j) ——矩阵A的第j列,所有行

A(:,i: j) ——矩阵A的第i到第j列,所有行

A(i:j, k:end)——矩阵A的第i到第j行,第k到最后一列 A(:, [1,3])——矩阵A的第1、第3列,所有行

A(:) ——按线性索引返回矩阵A的所有元素(向量)

3. 利用空矩阵删除矩阵元素

A(i, :) = []; % 删除矩阵A的第i行

A(:, j) = []; % 删除矩阵A的第j列

A(i:j, :) = [] % 删除矩阵A的第i到第j行

A(:, i:j) = [] % 删除矩阵A的第i到第j列

A(sub2ind( size(A), i, j) ) = [] % 删除矩阵A的第i行第j列的元素(注3)

三、矩阵运算与矩阵函数

1. 矩阵运算

(1) 通常的矩阵间运算

加、减、乘、幂: + - * ^

左除 \ :AX = B → X=A-1B → X = A\B

右除 / : YA = C → Y = C A-1 → Y = C/A

(2) 点运算——同型矩阵各个对应位置的元素做该运算 点乘、点左除、点右除、点幂: .* .\ ./ .^

.+ .- 同 + -

(3) 矩阵运算

转置: A’

方阵的逆:inv(A)

非方阵的广义逆:pinv(A) % ABA=A, BAB=B

矩阵或向量的范数:norm(A) = norm(A,2); norm(A,1); norm(A,inf) 方阵的行列式:det(A)

矩阵的秩:rank(A)

矩阵的迹:trace(A)

基础解系(矩阵的零空间):null(A)

标准正交化:orth(A)

化行最简型(初等行变换解线性方程组):rref(A)

两个子空间的夹角(两个向量的夹角):subspace(A,B)

方阵的特征值(对角阵d)与特征向量(v的列向量):[v,d]=eig(A)

2. 矩阵函数

min(A,dim) 按维度求矩阵A最小值,min(A) = min(A,1) 按列 max(A)=max(A,1) 求矩阵A各列的最大值

mean(A) = mean(A,1)求矩阵A各列的平均值

sort(A)矩阵各列按递增顺序排序

sort(A, 'descend') 矩阵各列按递减顺序排序

sum(A) 矩阵A各列元素求和

prod(A) 矩阵A各列元素求积

dot(A,B) A,B(同型)各列做内积(点积)

cross(A,B) A,B(至少某个维度是3维)的外积(叉积)

cumsum(A) 每列元素的累计和(第i行是A前i-1行元素的和) cumprod(A) 每列元素的累计积

四、三维矩阵

可以想象成一本书的“行、列、页”。

处理k个m×n的二维矩阵,可用一个m×n×k的三维矩阵A:

A(:, :, 1) 表示第1个m×n矩阵(第1页)

A(:, :, 2) 表示第2个m×n矩阵(第2页)

??????

A(:, :, k) 表示第k个m×n矩阵(第k页)

每个A(:, :, k)与2维矩阵操作一样。

D = rand(2,4,3) % 生成2×4×3的随机矩阵

DS = reshape(D,3,4,2) % 变形

运行结果:

D(:,:,1) = 0.1270 0.6324 0.2785 0.9575

0.9134 0.0975 0.5469 0.9649

D(:,:,2) = 0.1576 0.9572 0.8003 0.4218

0.9706 0.4854 0.1419 0.9157

D(:,:,3) = 0.7922 0.6557 0.8491 0.6787 0.9595 0.0357 0.9340 0.7577

DS(:,:,1) = 0.1270 0.0975 0.9575 0.9706 0.9134 0.2785 0.9649 0.9572

0.6324 0.5469 0.1576 0.4854

DS(:,:,2) = 0.8003 0.9157 0.6557 0.9340 0.1419 0.7922 0.0357 0.6787

0.4218 0.9595 0.8491 0.7577

注1. Matlab的变量名必须字母开头,由字母、下划线、数字构

成,对字母大小写敏感;起变量名时应避开Matlab里的关键词。

注2. Matlab语句结束用分号,若不用分号则自动输出语句的运

行结果。

注3. 矩阵删除单个元素必须用线性索引,否则会把报错。

相关推荐