webdancer's Blog

matlab编程3—添加工具箱

在matlab程序设计中,如果我们要引入别人的写好的工具箱,怎么做呢?

首先,介绍一下matlab中的两个概念:current directory 和 search directory。matlab中的文件操作将这两个文件夹作为引用点,所以我们的文件必须在这两个之一。

1.current directory

current directory在matlab的GUI的matlab toolbars中默认显示,我们很容易更改current directory.如下图:

2.search directory

安装工具箱,就是将工具箱路径,添加到search directory中。

有两种方式:

  1. 命令行。addpath(genpath('/path/to/targettoolbox'))
  2. 通过GUI界面。选择File-->setpath添加。

注意:matlab中,搜索目录中的函数在统一命名空间,这样如果函数重名,是一个比较让人不好办的问题。如果自己写的函数,不要与matlab内置函数重名;如果第三方toolboxs有重名现象,只好改名了。

matlab编程2

matlab里面记录代码的文件成为M-files。可以分为两种类型:script和function。

1.script。不接受输入,也不返回输出。它对workspace的数据进行操作。和python等的脚本文件是一样的,把在控制台的命令给保存起来。

2.function。接受输入参数,返回输出。这类文件的一个注意的地方就是文件名和函数名必须相同.

例子:

function r = rank(A,tol)
%RANK   Matrix rank.
%   RANK(A) provides an estimate of the number of linearly
%   independent rows or columns of a matrix A.
%   RANK(A,tol) is the number of singular values of A
%   that are larger than tol.
%   RANK(A) uses the default tol = max(size(A)) * eps(norm(A)).
%
%   Class support for input A:
%      float: double, single

%   Copyright 1984-2007 The MathWorks, Inc.
%   $Revision: 5.11.4.5 $  $Date: 2007/08/03 21:26:23 $

s = svd(A);
if nargin==1
   tol = max(size(A)) * eps(max(s));
end
r = sum(s > tol);

从这个例子中,看出:

1.从第一行看出,文件名与函数名一致。

2.%的行为注释,用help rank可以查看(当然,help方法删掉了一些没用的,比如最后两行)。

3.下面为函数体,是函数的实现。参数的参数数目可以用方法nargin和nargout获得。(n/arg/in)

function可以分为以下几种类型:

1.匿名函数。

不用创建专门的m文件,可在命令行,m文件内部创建。语法如下

f=@(arglist) expression

例子:

>> sqrt=@(x) x.^(1/2);

2.主函数和子函数。

函数类型的M文件需要一个主函数,放在第一位;后面可以跟若干个子函数(当然可以不跟)。

3.私有函数。

只对一些函数可见,放在名称为:private的目录下面。

4.嵌套函数。

在函数体内,定义新的函数。

提示:

构造字符串参数

用[]可以连接字符串,很容易来构造所需要的参数。

例子:

for i=1:10,
    s=['index' int2str(i) '.dat'];
    load(s);
end 

特殊的函数:

eval:可以执行matlab命令。

例子:

>> cmd='1+1';
>> eval(cmd)

函数句柄:

使用@符号,可以获得matlab函数的句柄。这通常在把matlab函数作为参数的时候非常有用。

function [f,g] = myfun(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2;    % Cost function
if nargout > 1
   g(1) = 6*x(1)+2*x(2);
   g(2) = 2*x(1)+2*x(2);
end

options = optimset('GradObj','on');
x0 = [1,1];
[x,fval] = fminunc(@myfun,x0,options);

使用矩阵运算代替迭代。

在matlab中矩阵运算都经过优化,速度较快。

 

matlab编程1

 

数据类型
前面已经学习了matlab编程的主要的数据类型就是矩阵。
介绍其他的一些数据类型:
** multiarrays
例如:rand(2,2,2)
** cellarrays
例如:carr=cell(8,1)
注意:
cellarrays用{}来索引,所以第二个元素为:carr{2}
cellarrays的元素可以使其他类型数据
**字符和文本
例如: str='hello world!'
**结构体
例如:
fp.no=9;
fp.name='torres';
 
控制流
1.条件语句。
if语句
if condition1,
   statement1
elseif condition2,
   statement2
else,
   statement3
end
与C语言的if是一致的,关键词不同,多了一个elseif。
 
switch语句
switch variable
    case constant1,
        statement1
    case constant2,
        statement2,
    otherwise,
        statement3
end
与C语言的switch是不一致的。matlab的switch不是fall through的。第一个case为true,下面的case
不会执行。
注意:在比较两个矩阵时,用isequal函数。
 
例子:
n = floor(real(double(n(1))));

if mod(n,2) == 1
   % Odd order 
   M = oddOrderMagicSquare(n);
elseif mod(n,4) == 0
   % Doubly even order.
   % Doubly even order.
   J = fix(mod(1:n,4)/2);
   K = bsxfun(@eq,J',J);
   M = bsxfun(@plus,(1:n:(n*n))',0:n-1);
   M(K) = n*n+1 - M(K);
else
   % Singly even order.
   p = n/2;   %p is odd.
   M = oddOrderMagicSquare(p);
   M = [M M+2*p^2; M+3*p^2 M+p^2];
   if n == 2
      return
   end
   i = (1:p)';
   k = (n-2)/4;
   j = [1:k (n-k+2):n];
   M([i; i+p],j) = M([i+p; i],j);
   i = k+1;
   j = [1 i];
   M([i; i+p],j) = M([i+p; i],j);
end
2.循环条件。
for语句
for condition,
    statement;
end
 
while语句
while condition,
      statement;
end
还有两个关键字 continue, break。和C语言中的用法是一致的。
 
例子:
二分法解方程x^3-2x-5。
 
a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
   x = (a+b)/2;
   fx = x^3-2*x-5;
   if fx == 0
      break
   elseif sign(fx) == sign(fa)
      a = x; fa = fx;
   else
      b = x; fb = fx;
   end
end
disp(x)
 
try-catch语句
try 
    statement1
catch
    statement2
end
 
语句与java中try-catch类似,try语句块里面有错误发生时,被catch捕获。错误可以用lasterr查看。
 
return语句
结束当前语句,返回到调用函数
 

matlab作图

matlab提供了很多的方法来作图。通过图像我们能够直观的来观察数据中的重要特征。我们可以根据我们的数据来选择作图的类型,比如:line,bar,histogram,pie等;还可以用来做三维图形,比如:surfaces等。

我们有有种基本的作图方式,命令行和作图工具。当然,我们可以把它们结合起来,比如用命令行作图后,用作图工具来修改。
 
1.使用plottools作图。
使用GUI的作图工具,可以实现很强大的功能。帮助文档介绍很详细。
2.作图函数。
这时我们在编程时需要的,可以自动的进行数据可视化。
数据:
>>X=-2*pi:.1:2*pi
>>Y=sin(X)
具体函数:
二维作图:plot
x坐标轴:xlabel
y坐标轴:ylabel
标题:title
注意:xlabel,ylabel,title都可以用tex的语法来写数学公式。
例子:
%作sin(x)的图像
>>plot(X,Y,'r');
>>xlabel('X');
>>ylabel('sin(X)');
>>title('the sin function');
通过修改plot的参数,可以同时画出多个函数
例如:
>>plot(X,Y,X,sin(X-.5));
>>legend('sin(x)','sin(x-0.5)'); %标注不同的函数
当然plot还有很多的参数,用来定义图像的外观。
holdon 可以让我们继续往前面的图像上添加函数。
subplot可以使我们在一个图像中使用多个坐标系。
例子:
>>subplot(2,1,1);plot(X,sin(X));
>>subplot(2,1,2);plot(X,cos(X));
mesh, surface ,contour
>> [X,Y]=meshgrid(-8:.1:8);
>> R=sqrt(X.^2+Y.^2)+eps;
>> Z=sin(R)./R;
>> mesh(X,Y,Z);
>>surf(X,Y,Z);
类似mesh
>>contour(X,Y,Z);
当然,使用matlab做好图形还需在实践中慢慢积累。

 

matlab入门

简介

matlab(matrix laboratory)是用来进行科学计算的高效语言,提供了计算,可视化,编程的易用环境。
toolboxs是matlab函数的集合,通常用来处理特定的问题,比如:数字信号,神经网络,小波等。
matlab软件通常包含以下几个部分:
1)开发环境。常用的命令窗口,编辑器,命令行历史,搜索路径等。
2)数学函数库。包含很多的数学函数。
3)matlab开发语言。
4)图形。
5)matlab API。可以让matlab与C/C++或是fortran交互。
 
矩阵
matlab中的矩阵和我们在线性代数中学的矩阵是一样的。matlab可以让我们很容易的处理整个矩阵。
matlab中矩阵的表示:
** 行元素用空格或是逗号隔开
** 一行的结尾用分号来标记
** 整个矩阵用[ ]来标记
举例:
A=[16 3 2 13; 5 10 11 8;9 6 7 12; 4 15 14 1]
 
下标。
** 在i行j列的元素:A(i,j) 也可表示为:A(i*j) 
** 结尾可以表示为end。如:A(end,end)
 
冒号运算符
在matlab中常用,可产生等差数列。
举例:
1:2:10
结果:
 1     3     5     7     9
和下标结合,如A矩阵的第2列: A(:,2)
 
 
表达式
在matlab的表达式中,真个矩阵参与运算。
变量:matlab中,不进行变量的声明。例如: var = 6
数字:支持复数和实数,象数学里面的传统表示(复数虚部可以用i或是j作为后缀)。例如 1+3j
运算符:
+  矩阵加
-  矩阵减
*  矩阵乘
/  解线性方程组
\  解线性方程组
^  幂运算 
'  转置,复数共轭
() 可以确定运算顺序
[] 连接
 
函数
matlab提供了很多的函数,而且很多函数都有复杂的参数,完成复杂的运算。
可以:
help elfun   查看基础函数
help specfun 查看高级专门函数
help elmat   查看产生矩阵的函数
函数可以分为:built-in和其他类型(比如m类型函数)。built-in无法查看代码,而其他类型可以查看代码。
一些常用的常数:pi,Inf,NaN,realmin,realmax,eps,i,j 可被覆盖。
例如:
eps=1.e-6
恢复:
clear eps
 
在编程中常用的:
产生矩阵:
zeros,ones, rand, randn等
载入数据:
load
 
M-Files:
可以写自己的函数或是脚本,文件名以后缀m结尾
 
计算矩阵行列式
det(A)
 
在上面的运算符前面加上. ,变为矩阵内元素相乘。
如:A.*B
 
++多元数据
matlab使用面向列的分析方式,其中每一列是一个变量,每一行是一个观测。(i,j)表示j变量的i个观测。
帮助:help datafun
 
可以用逻辑或是关系运算的结果做下标
例子:
A(~isprime(A))=0
 
find函数可以用来早满足某个条件的数,如:[i,j]=find(A==3)
 
format函数
控制数字的格式,常用有:format short , format long 等。
 
禁止在屏幕上打印
在语句结束时,加分号;
 

 




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee