Matlab基础知识

来源:互联网 发布:音频提取软件手机软件 编辑:程序博客网 时间:2024/06/10 04:44

基本数据类型

变量的使用

变量的赋值

几条秘籍:
1.直接赋值,无需定义类型
2.字符串或字符用单引号
eg: msg = ‘Hello World’

查看工作区的变量

whos:查看工作区的变量
clear all:清除工作区所有的变量
clc : 清屏

数据类型转换

matlab的数据类型和c差不多,只不过对于int类型具有更多的内存大小选择空间。int/uint具有8,16,32,64位的选择,如unit8,范围为0到255,;又如int16是-32768~32767
其他类型:
1. single 单精度浮点,内存4字节
2. logical 布尔类型,等同于boolean
默认情况下,matlab将变量存为双精度,但是在图像处理中,一般要用到unit8,所以要强制转换。
>> a = 1;
>> b = uint8(a)

读取或着存储工作区的变量

有时候得到一些变量的值,想存储下来已被后续使用。可以用save和load
如:
>> a = 1;
>> b = uint8(a)
>> save (‘ha1.mat’,’a’,’b’)
%将工作区的a和b存储到ha1.mat文件中,当然可以不指定参数,就会将所有的变量存储。
>>clear all
>>a
此时,出现 ??? Undefined function or variable ‘a’.
如果加载
load (‘ha1.mat’)
a
则显示
>>a =

>> 1

矩阵的使用

常规矩阵

  1. 直接法:A = [1 2 3; 4 5 6; 7 8 9]
    或是A = [1,2,3; 4,5,6; 7,8,9]
  2. 等间隔矩阵
    v = [2:1,10]
    v =

    2 3 4 5 6 7 8 9 10
    注意:两边都是闭的,如果是间隔为1,直接写成v=[2:10]

特殊矩阵

主要函数:
eye 单位矩阵
zeros 全为0矩阵
ones 全为1矩阵
rand 均为分布随机矩阵
randn 正态分布随机矩阵
eg: a = randn(5)
a =

0.8404 -0.6003 -2.1384 0.1240 2.9080
-0.8880 0.4900 -0.8396 1.4367 0.8252
0.1001 0.7394 1.3546 -1.9609 1.3790
-0.5445 1.7119 -1.0722 -0.1977 -1.0582
0.3035 -0.1941 0.9610 -1.2078 -0.4686

矩阵大小和维度

有时候你要看某个矩阵的大小,比如看第一维有多大,那么可以用size
size(A,dim) :dim为要查看的维数
看矩阵有几维用ndims(A)
A为3行5列的矩阵,那么
size(B,2) = 5;
size(B) = [3,5]
ndims(B) = 2

访问矩阵元素

注意:matlab矩阵是从1开始的!!!
显然提取对于二维数组,A(1,2)就是那个元素。但是如果要访问某一行或是某一列时,咋办呢?
利用“, :”或是“:,”就可以了。
A = [1 2 3; 4 5 6; 7 8 9];
k1 = A(1,:);
此时:k1 =

 1     2     3

也就是说返回的是一个行向量,将A的第一行提取出来了。同理可以提取列。如:k2 = A(: , 3);
k2 =

 3 6 9

类似的还有
1. A(m1:m2,n1,n2)
2. A(:) 将矩阵存为一个长的列向量
再如:inputSize = magic(3)
input =

 8     1     6 3     5     7 4     9     2

>> input(1:5)

ans =

 8     3     4     1     5

矩阵运算

我们都知道,矩阵的乘法是,比较麻烦的,得到矩阵的i行j列是第一个矩阵的i行的对应的数乘以第二个矩阵的j列对应的值,再求和。但是有时候我们就像让矩阵对应位置的数相乘,这时候是“.*“。
类似的还有:
1. .^ 每一个元素进行乘方
2. .\
3. ./

运算符 名称 说明
/ 右除 AB=C A=C/B
\ 左除 AB=C B=A\C
记忆方法:左除A\C inv(A)*C
右除 C/B B*inv(C)

常用矩阵函数

randperm, range, min/max/mean, size/length/numel/ndims, sum/prod, var/std, repmat, reshape,,bsxfun, cellfun,structfun,arrayfun等
值的注意的是,这些函数大部分有DIM参数,即所谓的“沿着第DIM维运算”,如:
c = [1 2; 3 4]; sum(c, 1)为[4, 6],此时有2列,而行被压扁成1行; 而sum(c, 2)为[3; 7],此时行数为2,而列数为1。可以这样想:“沿着”就是这一维的下标从1到最大值,其他维不变,进行函数运算。形象点就是说这一维被压扁了,只剩下一个了。另外matlab是按列填充数字的,比如c(3)是2,c(2) 是3,但第一维仍旧是行!!

细胞数组和结构体

细胞数组

一般来说我们返回一种数据类型,有时候我们想返回多个维度的值。细胞数组是一种特殊的数据类型。相当于python的list,内部可以是任意类型,通过下标访问
>> a ={‘a’,1,[1:4] }

a =

'a'    [1]    [1x4 double]

>> a{3}

ans =

 1     2     3     4

细胞数组用“{}”来定义,通过“{}”来访问元素。

结构体

这个其实和c语言的结构体是差不多的。直接通过“.“来定义和访问。
可以这样认为,在细胞数组的基础上加上了属性,而细胞数组相当于结构体中的各属性的值的集合,而缺失了属性。

a.Name=’a’;
a.Age=1;
a.list=[1:4]

举个例子
>> stu.book = {‘War’,’Peace’};
>> stu.name=’xiao’;

stu =

book: {'War'  'Peace'}name: 'xiao'

几个函数:
fieldnames(student); %返回字段名(此处返回 ‘book’和’name’)
isfield(student,’age’);
isstruct(student);
struct2cell(student);

>> stuCell =struct2cell(stu)

stuCell =

{1x2 cell}'xiao'    

% cell中用’{ }’是得到内容
>> stuCell{1}

ans =

'War'    'Peace'  

% cell中用’( )’是得到成员
>> stuCell(1)

ans =

{1x2 cell}

关系运算

其实没啥好说的,就是一点:“非”用“~”,例如:不等于“~=”,另外“!”不是matlab的阶乘。。


流程控制

常用的函数

  • isinf
  • isnan
  • isreal 判断是否为实矩阵
  • find
  • det 求行列式值
  • diag 抽取对角线元素
  • eig 求特征值和特征向量
  • inv 求逆矩阵
  • norm 求范数
  • rank 求矩阵秩

    流程控制

    简单一句话,一个流程中只有一个end!
    如:

    1. while/for …
      ,,,
      end
    2. if ..
      ..
      elseif …
      ..
      else
      ..
      end
    3. switch arg
      case arg1
      ..
      case arg2

      otherwise
      ..
      end
      总结:elseif是连在一起写的,另外switch中不是用default,而是用otherwise,另外就是一种流程控制中只有一个end!

meshgrid的使用

在图像处理中,经常会用到meshgird函数,其主要是根据给定的横纵坐标生成网络。
[X,Y]= meshgrid(x,y)
典型用法:
例如二维高斯函数:

H(u,v)=e[u2+v2]/2σ2

u = [-10:0.1:10];
v=[-10:0.1:10];
[U,V] = meshgrid(u,v);
H=exp(-(U.^2+V.^2)./2/3^2);
mesh(u,v,H);
注意:这里用的是.^和.*


函数编写

函数编写

一般来说,格式为:
function [outputs] = name(inputs)
如果是返回多个,就要用[]来括起来,如果值返回一个的话,就类似js的函数写法:
如:

  • 返回多个值
    function [imgOut,retCode] = imsmooth(imgIn,args)
  • 返回一个值
    function info = imfiinfo(filename,format)
  • 无返回值
    function imsmooth(imgIn.args)
0 0
原创粉丝点击