许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  初学matlab的小小心得与体会

初学matlab的小小心得与体会

阅读数 48
点赞 0
article_banner

将matlab中学到的代码知识心得汇总汇总,供自己以后复习学习用,温故而知新!首先开始量的积累,然后再去总结归纳!

(一)randperm 函数、randsample 函数

(二)rand函数、randi 函数、randn函数、unifrnd 函数

(三)length 函数、numel 函数、size函数

(四)find 函数

(五)max函数、min函数

(六)mapminmax函数、mapstd函数

(七)pdist 函数、squareform 函数

(八)setdiff 函数、union 函数 、intersect 函数


(一)randperm函数、randsample函数

(1)randperm:random permutation,随机排列的意思。

randperm(n) 将1至n的序列打乱随机排列。如:

>>randperm(5)
ans = 5 3 4 1 2 

randperm(m,n) 将前m个数中选取n个数进行随机排列,易知 m\geq n

>>randperm(8,5) 
ans = 5 7 9 8 3

本人在学习中还发现randperm的其他用途:

1)如想要选取某一某一个向量A=[a1,a2,...,an]中的任一个数。则可以通过代码:

>>A( randperm(length(A),1) )

ans = A中随机选取任一个数,且所有数被选中的概率相等。

(2)randsample:Random sample,随机取样。

randsample(n,k) randperm(n,k)的功能相同。

randsample(n,k,replacement) 同上,replacement表示是否允许重复,1表示k个元素可以有重复的,0表示不可以重复。

>> randsample(10,5,true)
ans =  3 6 10 10 2
>> randsample(10,5,false)
ans = 5 6 3 10 8

randsample(array,k)从array数组里面随机取出k个不相同的数。

randsample(array,k,replacement) 从array数组里面随机取出k个数,replacement表示是否允许重复,1表示k个元素可以有重复的,0表示不可以重复。

randsample(popluation,k,true,w) w为权重系数,来确定原数组population或数组中不同元素出现的频次,从而生成一个长度为k的由population中的元素组成的新数组。

>> randsample('ACGT',12,true,[0.15 0.35 0.35 0.15])
ans =  'AGTGGGCGCGAC'

(二)rand函数、randi函数、unifrnd函数

(1)rand:random,随机的意思。

rand(m,n) 产生由在[0,1]之间均匀分布的随机数组成m行n列的矩阵。

>>rand(3,4)
ans = 0.8300    0.1048    0.2396    0.4398
          0.5663    0.1196    0.8559    0.5817
          0.9281    0.2574    0.3013   0.9355

rand(m) 等同于rand(m,m)

rand就可以直接生成0到1的随机数,这个指令非常常用。

如果想随机生成-1和1。可以用如下指令:

>> sign(rand-0.5)
ans =
     1

(2)randi:random integral ,随机整数的意思。

randi([a,b],m,n) 在指定区间[a,b]内随机取出大小为m*n的整数矩阵。

当m=n时,可以简写为randi([a,b],m)

>>randi([1,5],4,5)
ans = 5     3     1     4     2
          3     3     2     2     5
          3     3     4     4     5
          5     4     2     1     2

randi([m,n]) 在指定区间[m,n]内随机取出一个整数。

如果想随机生成0和1,可以输入如下指令:

>>randi([0,1])
ans =
     1

rand(m,n) : 在1-m中随机取出整数,构成n×n的矩阵。

>> X = randi(3,4)

X =

     3     2     3     2
     3     1     1     1
     1     2     2     2
     2     1     1     3

(3)unifrnd: Continuous uniform random numbers.

unifrnd(a,b,m,n) 输出在区间[a,b]之间均匀分布的随机数组成的m*n的矩阵。

>> unifrnd(-2,2,3,2)
ans =
    1.7360    0.9725
    0.7149   -0.4311
    1.0310    0.6219

(4) randn:Normally distributed random numbers.

randn : 输出一个从标准正态分布中得到的随机标量。

randn(n) : 返回由正态分布的随机数组成的n×n矩阵。

>> randn(3)

ans =

    0.7254   -0.2050    1.4090
   -0.0631   -0.1241    1.4172
    0.7147    1.4897    0.6715

randn(m,n) : 返回由正态分布的随机数组成的m×n矩阵,同上。

若想生成服从正态分布 (\mu,\sigma^2) 的随机矩阵,则可以通过 \sigma*randn(m,n)+\mu 的方式来生成。



(三)length函数、numel函数、size函数

length:Length of largest array dimension,即返回数组维度的最大值。

>>length(zeros(3,4))
ans = 4

如果是矩阵,可以得到矩阵维度的最大值,如果是向量,则可以得到向量中的元素数。

numel:Number of array elements,返回数组中的元素数量。

>> numel(zeros(3,4))
ans = 12

size:Array dimensions,返回数组的维度数。

size基本上非常常用,其比较常见的用法如下:

a = size(X):得到数组X各个维度长度,若X为矩阵,得到其行数和列数。

>> size(rand(2,3))
ans =
     2     3

因此,若想分别获得矩阵的行与列,可以通过以下代码获得:

>> [m,n]=size(rand(2,3))
m = 2
n = 3 

m = size(X,dim) :得到数组X的任一维度长度,dim=1,为行数、dim=2,为列数,以此类推。


(四)find函数

find:Find indices and values of nonzero elements,常用的搜索定位计数函数。

find的用法较多,比较常用的如下:

find(X) :寻找数组X中不为0的元素,并返回其索引数(其索引数是按照如图所示的顺序索引的)。

matlab中元素索引顺序

find(~X):寻找数组X中为0的元素,若不存在为0的元素则返回空矩阵。

>>a =
     1   NaN     
     0      1  
>> find(a)
ans = 1 3 4 

find(condition):按照搜索条件搜索满足条件的所有元素的索引数。

>> find(a==1)
ans = 1 4 

[i,j]=find(condition):返回满足条件的所有元素的行数与列数。

 >>[i,j]=find(a==1)
i =
     1
     2
j =
     1
     2

可以看出,[i(k),j(k)]就是符合条件的元素坐标,但是matlab分别将行和列分别存在两个变量中了。

如果只想得到满足条件的部分元素呢?find可以按照正、反两个方面搜索满足条件的前N个元素。如:

>> x=randi(5,1,8)
x =
     3     5     4     5     4     1     5     5
>> find(x<5,2)
ans =
     1     3
>> find(x<5,2,'last')
ans =
     5     6

可以看出,即使按照反方向搜索,其索引数仍然是正向的,只不过得到的是按照正向索引所得到的最后几个元素索引数。如果想反向搜索,想知道满足条件的元素是倒数第几个的话,可以通过以下代码实现:

>>  numel(x)-find(x<5,2,'last')+1
ans =
     4     3

假如想搜索满足条件的第3个元素呢?可以通过以下代码实现:

>>a = find(x<5,3);a=a(end)
a =
     5

通过find函数不仅可以找到满足条件的索引数,还可以找到其元素值,如:

>> x(find(x<5,2))

ans =
     3     4

(五)max函数、min函数

max与min函数用法一致。

max:Largest elements in array,寻找最大值。

max(a) :寻找数组a中的最大元素。

max(a,b):返回a和b中的最大值,分一下情况:

>> a=magic(3)
a =
     8     1     6
     3     5     7
     4     9     2
>> max(a,2)
ans =
     8     2     6
     3     5     7
     4     9     2

如果a为矩阵或向量,b为一个数,则max会将a中所有小于b的数替换成b。

而如果b是一个与a相同大小的矩阵或向量,则max会两两对比取大值后得到一个新矩阵。

同理min函数用法一致。

而如果想得到矩阵中每行或者每列的最大值呢?则可以用以下代码:

max(x,[],dim):其中dim=1为按列求最大值(这里dim = 1是列,与size相反);dim = 2为按行求最大值。之所以加‘[]’是为了和max(a,b)区分。

>> max(x,[],2)
ans = 8 7 9
>> max(x,[],1)
ans = 8 9 7 

[i,j]=max(x,[],dim):i返回按照dim维度求得的最大值,j返回最大值的元素在每个维度中所处位置。


(五)mapminmax函数、mapstd函数

mapminmax: Process matrices by mapping row minimum and maximum values to [-1 1]。

其作用是将矩阵的每一行处理成[-1,1]区间。在统计和数据分析中非常常用。

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

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

(1)右边的输入为X,YMIN和YMAX。X是结构为m×n的矩阵,其中每一列应该是一个样本,每一行则是多个样本的同一属性值。为了将该属性下的所有样本值进行规范化处理。我们界定其规范化后的最大值YMAX(默认为1)及其最小值YMIN(默认为-1)。

(1)左边的输出Y为X规范化处理后的新矩阵。PS是一个结构体,其记录了X中最大最小值、结构,极差等参数。其作用主要是记录原始样本的结构以便后续的反归一化或者新样本的规范化。

(2)的用法本质与(2)相同,FP是一个结构体成员主要是FP.YMIN, FP.YMAX这个结构体就可以代替1中的YMIN和YMAX。

>> [1 2 3 4 5]
ans =  1     2     3     4     5
>> [Y,PS]=mapminmax(ans,0,1)
Y =  0    0.2500    0.5000    0.7500    1.0000
PS =  包含以下字段的 struct:
         name: 'mapminmax'
        xrows: 1
         xmax: 5
         xmin: 1
       xrange: 4
        yrows: 1
         ymax: 1
         ymin: 0
       yrange: 1
         gain: 0.2500
      xoffset: 1
    no_change: 0

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

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

(3)主要是对新样本X进行规范化处理,并按照X的处理方式重新进行规范化。如下:

x=[2,3,4,5,6;7,8,9,10,11]; 
y=[2,3;7,8]; 
[xx,ps]=mapminmax(x,0,1); 
mapminmax('apply',y,ps)
ans =
         0    0.2500
         0    0.2500

(4)则是将预处理过后的样本数据Y进行反归一化从而得到原始数据。如下:

x=[2,3,4,5,6;7,8,9,10,11]; 
y=[2,3;7,8]; 
[xx,ps]=mapminmax(x,0,1); 
yy =mapminmax('apply',y,ps);
mapminmax('reverse',yy,ps)
ans =
     2     3
     7     8

可以看出(3)和(4)互为逆处理过程。mapminmax的规范化公式为

\tilde{x}=(y_{max}-y_{min})\frac{x-x_{min}}{x_{max}-x_{min}}+y_{min}

如果某行的数据全部相同,此时xmax=xmin,除数为0,则此时数据不变。

mapstd:Process matrices by mapping each row's means to 0 and deviations to 1。

将矩阵的每一行映射为0均值1方差的数据。

(1)[Y,PS] = mapstd(X,ymean,ystd)

(2) [Y,PS] = mapstd(X,FP)

(3)Y = mapstd('apply',X,PS)

(4)X = mapstd('reverse',Y,PS)

可以看出,其用法与mapminmax基本上一样,不过其是根据样本的均值ymean与标准差ystd进行规范化处理。

>> x=[2,3,4,5,6;7,8,9,10,11];
y=[2,3;4,5];
[xx,ps]=mapstd(x,0,1);
yy=mapstd('apply',y,ps)
mapstd('reverse',yy,ps)
yy =
   -1.2649   -0.6325
   -3.1623   -2.5298
ans =
     2     3
     4     5

mapstd的规范化公式为

\tilde{x}=(\frac{y_{mean}}{x_{mean}})\ast(x-x_{mean})+y_{mean}


(七)pdist 函数、squareform 函数

这一组函数在聚类中经常使用,是用来计算样本之间的距离以及形成距离矩阵的。

pdistPairwise distance between pairs of observations.

成对观测值之间的两两距离。

(1)pdist(X) : 返回 X 中成对观测值之间的欧几里德距离。

>> X = randi(3,4)

X =

     3     2     3     2
     3     1     1     1
     1     2     2     2
     2     1     1     3

>> pdist(X)

ans =

    2.4495    2.2361    2.6458    2.6458    2.2361    2.0000

其中,X中的行向量代表一个样本,pdist是按照(1,2)(1,3)(1,4)(2,3)(2,4)(3,4)的方式输出结果的,且默认的距离度量方式是欧式距离。

如果想用其他距离度量方式的话,如下。

(2)pdist(X,distance) : 使用 Distance 指定的方法返回距离。

>> X = randi(3,4)

X =

     3     3     3     3
     2     1     1     1
     1     3     2     3
     1     2     1     3

>> pdist(X,'minkowski')

ans =

    3.6056    2.2361    3.0000    3.1623    2.4495    1.4142

某些距离度量是有参数的,若想改变其参数设置,如下。

(3) pdist(X,distance,DisParameter) : 使用DistanceDistParameter指定的方法返回距离。仅当Distance'seuclidean''minkowski''mahalanobis'时,您才能指定DistParameter

>> X = randi(3,4)

X =

     3     3     1     2
     1     2     1     2
     2     3     1     1
     1     1     3     3

>> pdist(X,'minkowski',3)

ans =

    2.0801    1.2599    2.9240    1.4422    2.1544    2.9240

pdist计算样本间距离后的呈现方式在样本较多时明显是不尽人意的,因此还有一个函数专门将其结果转换成距离矩阵,使得结果能更好地呈现。

squareform :Format distance matrix。

(1)squareform(pdist(X)) : 生成距离矩阵。

>> X = rand(3,2);
>> D = squareform(pdist(X))

D =

         0    0.8507    0.6790
    0.8507         0    0.9108
    0.6790    0.9108         0

(七)setdiff 函数、union 函数

setdiff : Set difference of two arrays.

(1) setdiff(A,B) : 返回 A 中存在但 B 中不存在的数据,即集合 A-B 中的元素。不包含重复项,输出是从小到大排序的。

>> A = [3 6 2 1 5 1 1]
>> B = [2 4 6]
>> C = setdiff(A,B)
C =
     1     3     5

若原有的排序很重要,则可以通过以下方式保留原来的排序。

(2)setdiff(A,B,setOrder) : 返回 A 中存在但 B 中不存在的数据,不包含重复项。setOrder为‘sorted’时为从小到大排序;setOrder为‘stable’时则按照原有的顺序排序。

>> A = [3 6 2 1 5 1 1]
>> B = [2 4 6]
>> C = setdiff(A,B,'stable')
C =
     3     1     5

(3)[C,ia] = setdiff(A,B) : 多返回一个列向量ia,为C中所有元素在A中所对应的索引。

>> A = [3 6 2 1 5 1 1]
>> B = [2 4 6]
>> [C,ia]= setdiff(A,B,'stable')
C =
     3     1     5
ia =

     1
     4
     5

union :Set union of two arrays(两个数组的并集).

(1) C = union(A,B) : 返回A和B的并集,即 A\cup B 中的元素,输出从小到大排序。

(2) C = union(A,B,setOrder):同理,setOrder为‘sorted’时为从小到大排序;setOrder为‘stable’时则按照原有的顺序排序。

(3) (C,ia,ib) = union(_) : 多返回列向量ia和ib,分别对应C中元素在A和B中的索引。

>> A = [5 7 1]; 
   B = [3 1 1];
>> [C,ia,ib] = union(A,B)
C =
     1     3     5     7
ia =
     3
     1
     2
ib =
     1

可以看出,其元素索引是以A优先的,即A和B中都出现的元素,只在ia中显示,而ib中则不再显示。且有重复时只显示第一个索引。

intersect :Set intersection of two arrays(两个数组的交集).

(1) C = intersect(A,B) : 返回A和B的交集,即 A\cap B 中的元素,输出从小到大排序。

(2) C = intersect(A,B,setOrder) :同理,setOrder为‘sorted’时为从小到大排序;setOrder为‘stable’时则按照原有的顺序排序。

(3) [C,ia,ib] = intersect(___): 多返回列向量ia和ib,分别对应C中元素在A和B中的索引。

>> A = [7 1 7 7 4]; B = [7 0 4 4 0];
>> [C,ia,ib] = intersect(A,B,'stable')
C =
     7     4
ia =
     1
     5
ib =
     1
     3


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks ,Hyperworks, Protel,CAXA,OpenWorks LandMark,MATLAB,Enovia,Winchill,TeamCenter,MathCAD,Ansys, Abaqus,ls-dyna, Fluent, MSC,Bentley,License,UG,ug,catia,Dassault Systèmes,AutoDesk,Altair,autocad,PTC,SolidWorks,Ansys,Siemens PLM Software,Paradigm,Mathworks,Borland,AVEVA,ESRI,hP,Solibri,Progman,Leica,Cadence,IBM,SIMULIA,Citrix,Sybase,Schlumberger,MSC Products...

相关文章
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空