Matlab函数解析

来源:互联网 发布:淘宝魅力惠旗舰店 编辑:程序博客网 时间:2024/06/02 05:39


tic  toc

tictoc用来记录matlab命令执行的时间。

  tic用来保存当前时间,而后使用toc来记录程序完成时间。

  两者往往结合使用,用法如下:

  tic

  operations

  toc

  显示时间单位:秒

 

size()

可以用来输出矩阵的行数、列数;或者输出图像的高度和宽度

I = imread('E:\Cut1.JPG');

[X , Y]=size(I)

注意,如果是3通道的图像需要使用:

[m , n , c] = size(a)





% 图片大小 366×500 RGB 彩色图片

% f(:,:,1)  红色分量

% f(:,:,2)  绿色分量

% f(:,:,3)  蓝色分量


double()       im2double()       mat2gray()

****************假设某图像数据Auint8格式)**********************

A =

 235 200  89  20

>> double(A)                %返回与原矩阵数值相同但类型为double的矩阵;

ans =

   235  200 89  20

>> im2double(A)             

%返回矩阵类型:double;数值范围[0 1] ,0对应uint8中的01对应uint8中的255

ans =

   0.9216   0.7843   0.3490   0.0784

>> mat2gray(A)               %对原矩阵归一化

ans =

    1.0000   0.8372  0.3209      0

*********假设矩阵A为一般二维数组,非图像数据(double格式)******************

A =

  235  200    89   20

>> double(A)

ans =

  235  200   89   20

>> im2double(A)

ans =

  235  200   89   20

>> mat2gray(A)

ans =

   1.0000   0.8372    0.3209     0

**********************小结***************************

im2double:如果输入类型是uint8unit16logical,则按照0-->>0255-->>1,将其值按比例处理成01之间的double数值;如果输入类型是double,输出没有处理;

double:返回数值与输入相同的double类型矩阵;

mat2gray:对输入进行归一化处理,最小值-->>0;最大值-->>1,输出类型为double

在实际的对图像处理过程中,由于我们读入图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此通常使用im2double函数将图像数据转换成双精度型数据。


extractHOGFeatures()


I1 = imread('gantrycrane.png');

[hog1, visualization] = extractHOGFeatures(I1,'CellSize',[3232]);

subplot(1,2,1);    一行两列个子图,此时画第一个子图

imshow(I1);

subplot(1,2,2);    一行两列个子图,此时画第二个子图

plot(visualization);

其中返回值hog1为特征向量,visualization为特征的可视化图像。



imresize()


B = imresize(A, m)


返回的图像B的长宽是图像A的长宽的m倍,即缩放图像。 m大于1则放大图像; m小于1缩小图像。


B = imresize(A, [numrows numcols])


numrowsnumcols分别指定目标图像的高度和宽度。显而易见,由于这种格式允许图像缩放后长宽比例和源图像长宽比例不相同,因此所产生的图像有可能发生畸变。


 


关于matlab的运算符的问题( .* 以及 ./ )


建议你自己试一下:


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


A2=A*A %没点


A3=A.*A %有点


 


B=[1,2];


B2=B*B %这个会出错


B3=B.*B %这个不会出错


 


点乘的话,是对应元素相乘。


没点的话,按照矩阵相乘法则进行,这就要求前一个矩阵的列数等于第二个矩阵的行数。好好看一下上面的AB两个例子。


 


相应的点除也是这样的.


你不加点,如果R是一个向量的话,就会变成向量除向量.加点表明是相应元素相除.


 


svmtrainsvmpredict简介


(1)model= svmtrain(train_label,train_matrix, ['libsvm_options']);


其中:


train_label表示训练集的标签。


train_matrix表示训练集的属性矩阵。


libsvm_options是需要设置的一系列参数,各个参数可参见《libsvm参数说明.txt》,里面介绍的很详细,中英文都有的。如果用回归的话,其中的-s参数值应为3


model:是训练得到的模型,是一个结构体(如果参数中用到-v,得到的就不是结构体,对于分类问题,得到的是交叉检验下的平均分类准确率;对于回归问题,得到的是均方误差)。


 


(2)[predicted_label, accuracy/mse,decision_values]=svmpredict(test_label, test_matrix, model,['libsvm_options']);


其中:


test _label表示测试集的标签(这个值可以不知道,因为作预测的时候,本来就是想知道这个值的,这个时候,随便制定一个值就可以了,只是这个时候得到的mse就没有意义了)。


test _matrix表示测试集的属性矩阵。


model是上面训练得到的模型。


libsvm_options是需要设置的一系列参数。


predicted_label表示预测得到的标签。


accuracy/mse是一个3*1的列向量,其中第1个数字用于分类问题,表示分类准确率;后两个数字用于回归问题,第2个数字表示mse;第三个数字表示平方相关系数(也就是说,如果分类的话,看第一个数字就可以了;回归的话,看后两个数字)。


decision_values表示决策值(一般好像不怎么用)。


 


length()


问:


if length(h)>1 || h<0 || h>2*b


 return


是什么意思?


答:


length(x)表示向量x的坐标分量的个数,即向量的维数。


程序的意思是:若向量h的长度>1h<0(每个分量<0)h>2*b(对应的每个分量都是前者的>后者的)则返回调用程序处。


 


rem() mod()  floor()  fix() ceil()  round()


fix() floor() ceil()  round()都是用来取整的


1) fix(x) :截尾取整.


>> fix( [3.12 -3.12])


ans =


    3   -3


(2)floor(x):不超过x的最大整数.(高斯取整)


>> floor( [3.12 -3.12])


ans =


    3   -4


(3) ceil(x):大于x的最小整数


>> ceil( [3.12 -3.12])


ans =


    4   -3


(4) round(x)四舍五入取整


>> round(3.12 -3.12)


ans =


    0


>> round([3.12 -3.12])


ans =


    3   -3


MATLAB中四个取整函数具体使用方法如下:


Matlab取整函数有: fix, floor,ceil, round.


fix


朝零方向取整,如fix(-1.3)=-1; fix(1.3)=1;


floor


朝负无穷方向取整,如floor(-1.3)=-2; floor(1.3)=1;


ceil


朝正无穷方向取整,如ceil(-1.3)=-1; ceil(1.3)=2;


round


四舍五入到最近的整数,如round(-1.3)=-1;round(-1.52)=-2;round(1.3)=1;round(1.52)=2


 


rem() mod()


昨天在学习Matlab的数学函数时,教程中提到取模(mod)与取余(rem)是不同的,今天在网上具体查了一下:


 


 通常取模运算也叫取余运算,它们返回结果都是余数.remmod唯一的区别在于:


    xy的正负号一样的时候,两个函数结果是等同的;当xy的符号不同时,rem函数结果的符号和x的一样,而mody一样。


   这是由于这两个函数的生成机制不同,rem函数采用fix函数,而mod函数采用了floor函数(这两个函数是用来取整的,fix函数向0方向舍入,floor函数向无穷小方向舍入)。


   remxy)命令返回的是x-n.*y,如果y不等于0,其中的n = fix(x./y),而mod(x,y)返回的是x-n.*y,当y不等于0时,n=floor(x./y)


 


 


两个异号整数取模取值规律           (当是小数时也是这个运算规律,这一点好像与C语言的不太一样)


 


 先将两个整数看作是正数,再作除法运算


①能整除时,其值为0


 ②不能整除时,其值=除数×(整商+1)-被除数


 


 例:mod(36,-10)=-4


即:36除以10的整数商为3,加1后为4;其与除数之积为40;再与被数之差为(40-36=4);取除数的符号。所以值为-4


 例:mod(9,1.2)=0.6


例:


>> mod(5,2)


 ans=1                  %“除数”是正,“余数”就是正


>> mod(-5,2)


 ans=1


 >> mod(5,-2)


 ans=-1                 %“除数”是负,“余数‘就是负


>> mod(-5,-2)


 ans=-1                 %rem时,不管“除数”是正是负,“余数”的符号与“被除数”的符号相同


>> rem(5,2)


 ans=1                  %“被除数”是正,“余数”就是正


>> rem(5,-2)


 ans=1


 >> rem(-5,2)


 ans=-1                %“被除数”是负,“余数”就是负


>> rem(-5,-2)


 ans=-1


 


rand(m,n)


x=rand(m,n)产生mn列的位于(01)区间的随机数


>> x=rand(1,8)


x =


   0.8147   0.9058    0.1270   0.9134   0.6324    0.0975   0.2785   0.5469


 


sort()


(1)B=sort(A)对一维或二维数组进行升序排序,并返回排序后的数组,A为二维时,对数组每一列进行排序.(当A为一维时,原来是行向量排完还是行向量;原来是列向量排完还是列向量)


eg: A=[1,5,3],sort(A)=[1,3,5]


  A=[1,5,3;2,4,1],sort(A)=[1,4,1;2,5,3]


(2)B=sort(A,dim),对数组按指定方向进行升序排序,


dim =1,表示对每一列进行排序,,dim=2表示对每一行进行排序.


(3)B=sort(A,dim,mode),mode为指定排序模式,mode"ascend",进行升序排序,"descend",进行降序排序.


(4)[B,I]=sort(A,.....),I为返回的排序后元素在原数组中的行位置或列位置.


 


X=magic(5)


X =


17 24 1 8 15


23 5 7 14 16


4 6 13 20 22


10 12 19 21 3


11 18 25 2 9


>> [a,b]=sort(X,2)


a =


1 8 15 17 24


5 7 14 16 23


4 6 13 20 22


3 10 12 19 21


2 9 11 18 25


 


b =


3 4 5 1 2


2 3 4 5 1


1 2 3 4 5


5 1 2 3 4


4 5 1 2 3


 


结果解释:


a是原来的矩阵x按照行,每行从小到大重新排列得到的新矩阵。


b告诉你重排的详细信息,也就是做了什么样的变动。


例如b的第一行显示3 4 5 1 2,即排序后矩阵a的第一行分别对应原矩阵的3 4 5 1 2位置。


 


input()


例子1


>> input('请输入一个矩阵:')


请输入一个矩阵:magic(3)


ans =


    8    1     6


    3    5     7


    4    9     2


 


例子2


>> input('请输入一个字符串:','s')


请输入一个字符串:magic(3)


ans =


magic(3)


两种情况下,用户输入的同样是magic(3)这样一个字符串,但在前一种条件下,magic(3)被理解成一个表达式,所以返回一个3阶的幻方矩阵,而后一种情况下,则直接返回这个字符串。第二个例子中的那个‘s’是选项,表示把输入理解为字符串。


 


mapminmax()


Y = mapminmax(X);


[Y,PS] = mapminmax(X,YMIN,YMAX)


[Y,PS] = mapminmax(X,FP)


Y = mapminmax('apply',X,PS)


X = mapminmax('reverse',Y,PS)


 


mapminmax()将矩阵中每一行规范化到[YMIN,YMAX]范围内,默认为[-1,1]


FP是一个结构体,里面保存着YMIN,YMAX的值


映射记录保存在结构体PS中。


由于映射记录保存在PS中,所以参数‘apply’表示本次映射采取跟PS同样的映射。


X = mapminmax('reverse',Y,PS)的作用就是进行反归一化,将归一化的数据反归一化再得到原来的数据。


 


Eg


fs.ymin = 0;  %注意,这个结构体的成员名称必须是yminymax


fs.ymax = 1;


x1 = [1 2 4; 3 2 2; 0 0 0;4 4 4];


[y1,ps] = mapminmax(x1,0,1);


[y2,ps2] = mapminmax(x1,fs);


[y3,ps3] = mapminmax(x1,ps); %注意,若不写参数,则默认为‘apply’,即psfs效果相同


[y4,ps4] = mapminmax('apply',x1,ps);


x = mapminmax('reverse',y4,ps);


输出结果:


y1 =


        0   0.3333    1.0000


   1.0000        0         0


        0        0         0


   4.0000   4.0000    4.0000


y2 =


        0   0.3333    1.0000


   1.0000        0         0


        0        0         0


   4.0000   4.0000    4.0000


y3 =


        0   0.3333    1.0000


   1.0000        0         0


        0        0         0


   4.0000   4.0000    4.0000


y4 =


        0   0.3333    1.0000


   1.0000        0         0


        0        0         0


   4.0000   4.0000    4.0000


x =


    1    2     4


    3    2     2


    0    0     0


    4    4     4





神经网络


feedforwardnet ()


feedforwardnet ( hiddenSizes , trainFcn )matlab2012后较新的版本),在老版本的matlab,这个函数是newff。这个函数就是创建一个上述的(前馈)网络,包括两个参数,第一个hiddenSizes隐藏层的大小(实际就是节点数的多少,默认10),trainFcn是网络训练所采取的方法,这个方法包括:梯度下降算法、动量梯度下降算法、变学习率梯度下降算法等等数10种方法,各种方法各有优缺点,而有代表性的方法是有代表性的五种算法为:traingdx,trainrp,trainscg,trainoss,trainlm’,默认的是’trainlm’。其实不需要了解的太详细,一般的数据默认的方法就非常的好了,所以这个参数可以不用管。


建立隐藏层为10个节点,采用默认训练算法的神经网络:


        net= feedforwardnet(10);


 


train()


训练神经网络:


        net= train(net, traindata, trainlabel);


神经网络train(net, P, T)函数要求P,T都是一列为一个样本,即,Pr*q矩阵,Tu*q矩阵


即,P , T的形式化描述为:



训练过程中弹出的窗体解释:

http://blog.csdn.net/q1302182594/article/details/8790613




sim()


an = sim(net,testdata);


net为训练好的网络,testdata是测试数据,an直接输出预测结果。







0 0
原创粉丝点击