# matlab基本函数

PS：可能函数的顺序有点混乱。多年之后再看看，是写的真的乱。(2018-03-16)

### 1 bsxfun函数

函数功能：两个数组间元素逐个计算的二值操作

@plus 加
@minus 减
@rdivide 左除
@ldivide 右除
@power 数组幂乘
@max 二值最大值
@min 二值最小值
@rem 余数
@mod 求模
@atan2 四象限反正切
@hypot 平方和的平方根
@eq 等于
@ne 不等于
@lt 小于www.iLoveMatlab.cn
@le 小于或等于
@gt 大于
@ge 大于或等于
@and 逻辑并
@or 逻辑或
@xor 逻辑异或

A = magic(5)
A =
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 = bsxfun(@minus, A, mean(A))book.iLoveMatlab.cn
A =

4 11 -12 -5 2
10 -8 -6 1 3
-9 -7 0 7 9
-3 -1 6 8 -10
-2 5 12 -11 -4

### 2 clc函数

clc
Clear Command Window
GUI Alternatives
As an alternative to the clc function, select Edit > Clear Command Window in the MATLAB desktop.
Syntax
clc
Description
clc clears all input and output from the Command Window display, giving you a "clean screen."
After using clc, you cannot use the scroll bar to see the history of functions, but you still can use the up arrow to recall statements from the command history.
Examples
Use clc in a MATLAB code file to always display output in the same starting position on the screen.

### 3 crossvalind函数

关于crossvalind函数 盛经纬 jevonsheng@163.com

crossvalind是cross-valindation的缩写，意即交叉检验。 常用的形式有：

①Indices =crossvalind('Kfold', N, K)

②[Train, Test] = crossvalind('HoldOut',N, P) ③[Train, Test] = crossvalind('LeaveMOut',N, M)

④[Train, Test] = crossvalind('Resubstitution',N, [P,Q])

①indices =crossvalind('Kfold', N, K)：

[m n]=size(data); %data为样本集合。每一行为一个观察样本

indices = crossvalind('Kfold',m,10); %产生10个fold，即indices里有等比例的1-10

for i=1:10

test=(indices==i); %逻辑判断，每次循环选取一个fold作为测试集 train=~test; %取test的补集作为训练集，即剩下的9个fold

data_train=data(trian,:); %以上得到的数都为逻辑值，用与样本集的选取 label_train=label(train,:); %label为样本类别标签，同样选取相应的训练集 data_test=data(test,:); %同理选取测试集的样本和标签 label_test=label(test,:); end

②[Train, Test] = crossvalind('HoldOut',N, P)：

groups=ismenber(label,1); %label为样本类别标签，生成一个逻辑矩阵groups,1用来逻辑判断筛选

[train, test] = crossvalind('holdOut',groups); %将groups分类，默认比例1:1，即P=0.5

③[Train, Test] = crossvalind('LeaveMOut',N, M)：

[m,n]=size(data);

[train,test]=crossvalind('LeaveMOut',m,10)

svmStruct = svmtrain(data(train,:),groups(train));  classes = svmclassify(svmStruct,data(test,:));  cp=classperf(groups); cr=cp.CorrectRate

④[Train, Test] = crossvalind('Resubstitution',N, [P,Q])：

### 4 ismember函数

MATLAB中ismember函数

a=[1 2 3 4 5];

b=[3 2 5 6 7 8 77 44 3];

[tf index]=ismember(a,b); %判断a中的元素有没有在b中出现 tf =

0     1     1     0     1

index =

0     2     9     0     3

%tf返回一个和a同样大小的矩阵，a的元素在b中出现，tf上的相应位置元素值为1，没有出现则为0；index也是返回一个和a同样大小的矩阵，其相应位置的值为a相应位置的元素在b中出现的最后标号，注意是最后的标号，若某元素在b中出现多次，则记录的是最后一次出现的标号，若该位置上的a的元素没有在b中出现，则返回0.

### 5 matlab if else end 写法(格式)

if expression1
statements1；
elseif expression2
statements2；
statement22；
statement22；
else
statements3；
end

### 6 matlab穷举

##### 方法1
命令：
combntns(set,subset)

combntns([2 3 5 9 7],3)

2     3     5
2     3     9
2     3     7
2     5     9
2     5     7
2     9     7
3     5     9
3     5     7
3     9     7
5     9     7

perms(vector)

perms([2 3 5])

5     3     2
5     2     3
3     5     2
3     2     5
2     3     5
2     5     3

#### 方法2

help nchoosek or combntns

>> A1=combntns([60,61,62],2)
A1 =
60    61
60    62
61    62
>> A2=combntns([60,61,62],1)
A2 =
60
61
62

combntns(set,subset)

combntns([2 3 5 9 7],3)

2     3     5
2     3     9
2     3     7
2     5     9
2     5     7
2     9     7
3     5     9
3     5     7
3     9     7
5     9     7

perms(vector)

perms([2 3 5])

5     3     2
5     2     3
3     5     2
3     2     5
2     3     5
2     5     3

### 7 matlab交集和并集

intersect(A,B)
A与B的交集
Union(A,B)
A与B的并集

### 8 matlab判断矩阵相等

问题：

>> a = magic(5)
a =
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
>> b = [ 5 4 3 2 1]
b =
5     4     3     2     1
>> c = a(:,b)
c =
15     8     1    24    17
16    14     7     5    23
22    20    13     6     4
3    21    19    12    10
9     2    25    18    11

isequal(sortrows(a.'),sortrows(c.'))

a = magic(5)
b = [ 5 4 3 2 1];
c = a(:,b)
arr_matrix=perms(1:size(a,2));
for k=1:size(arr_matrix,1)
if isequal(a(:,arr_matrix(k,:)),c)
fprintf('a，c可以通过列变换变得一样\n\n')
fprintf('对应原矩阵的列为：\n')
disp(arr_matrix(k,:))
end
end

a =
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
c =
15     8     1    24    17
16    14     7     5    23
22    20    13     6     4
3    21    19    12    10
9     2    25    18    11
a，c可以通过列变换变得一样

对应原矩阵的列为：
5     4     3     2     1

### 9 matlab 设置矩阵

问题：
matlab编程，如何将一矩阵中等于某个值的元素全部替换成另一个值？

PS：不要用两个for循环，然后对每个元素逐一比较，再令它等于1的那种，需要步骤少运算快些的
%if you have a matrix A
idx=find(A==1.5); % find all 1.5
A(idx)=1; % set 1 to these indexes

idx=find(isnan(A)); % find all  NaN value
A(idx)=1; % set 1 to these indexes

### 10 matlab中crossvalind函数

今天用到crossvalind. 这个适用于Cross validation。中文应该叫做交叉验证。我主要想说说这个函数怎么用的。举个简单的例子；
P_train=[1 2 3 4 5 6 7 8 ]'
P_train =

1
2
3
4
5
6
7
8
Indices=crossvalind('Kfold',8,4)
Indices =

2
3
4
1
4
1
3
2

val_set_index=(Indices==1)

val_set_index =

0
0
0
1
0
1
0
0
train_set_index=~val_set_index

train_set_index =

1
1
1
0
1
0
1
1

>>val_ma=P_train(val_set_index,:);%val_set_index=[0 0 0 1 0 1 0 0]'
>> val_ma
val_ma =

4
6

### 11 matlab中K-Means用法

K-means聚类算法采用的是将N*P的矩阵X划分为K个类，使得类内对象之间的距离最大,而类之间的距离最小。

Idx=Kmeans(X,K)
[Idx,C]=Kmeans(X,K)
[Idx,C,sumD]=Kmeans(X,K)
[Idx,C,sumD,D]=Kmeans(X,K)
[…]=Kmeans(…,’Param1’,Val1,’Param2’,Val2,…)

X N*P的数据矩阵
K 表示将X划分为几类，为整数
Idx N*1的向量，存储的是每个点的聚类标号
C K*P的矩阵，存储的是K个聚类质心位置
sumD 1*K的和向量，存储的是类间所有点与该类质心点距离之和
D N*K的矩阵，存储的是每个点与所有质心的距离

[…]=Kmeans(…,'Param1',Val1,'Param2',Val2,…)

1. ‘Distance’(距离测度)
‘sqEuclidean’ 欧式距离（默认时，采用此距离方式）
‘cityblock’ 绝度误差和，又称：L1
‘cosine’ 针对向量
‘correlation’   针对有时序关系的值
‘Hamming’ 只针对二进制数据

2. ‘Start’（初始质心位置选择方法）
‘sample’ 从X中随机选取K个质心点
‘uniform’ 根据X的分布范围均匀的随机生成K个质心
‘cluster’ 初始聚类阶段随机选择10%的X的子样本（此方法初始使用’sample’方法）
matrix 提供一K*P的矩阵，作为初始质心位置集合

3. ‘Replicates’（聚类重复次数）

data=
5.0 3.5 1.3 0.3 -1
5.5 2.6 4.4 1.2 0
6.7 3.1 5.6 2.4 1
5.0 3.3 1.4 0.2 -1
5.9 3.0 5.1 1.8 1
5.8 2.6 4.0 1.2 0

[Idx,C,sumD,D]=Kmeans(data,3,'dist','sqEuclidean','rep',4)

Idx =
1
2
3
1
3
2

C =
5.0000 3.4000 1.3500 0.2500 -1.0000
5.6500 2.6000 4.2000 1.2000       0
6.3000 3.0500 5.3500 2.1000 1.0000

sumD =
0.0300
0.1250
0.6300

D =
0.0150 11.4525 25.5350
12.0950 0.0625 3.5550
29.6650 5.7525 0.3150
0.0150 10.7525 24.9650
21.4350 2.3925 0.3150
10.2050 0.0625 4.0850

matlab-kmeans函数注释

X = [randn(100,2)+ones(100,2);...
randn(100,2)-ones(100,2)]; 产生100个样本点，行指向每个样本，列是维变量值。
opts = statset('Display','final');

[idx,ctrs] = kmeans(X,2,'Distance','city','Replicates',5,'Options',opts);
%返回参数意义：[IDX,C,sumd,D]=kmeans()
IDX:每个样本点所在的类别
C：所聚类别的中心点坐标位置k*p，k是所聚类别
sumd:每个类内各点到中心点的距离之和
D：每个点到各类中心点的距离n*k

Matlab聚类分析中kmeans函数运行结果，请教为什么？
k=5;
[IDX,C,sumd,D] =kmeans(SCORE(:,1:3),k);

IDX是1~5的整数，表示归到了那一类；
C是每一类的质心位置，大小是5*3；
sumd是每一类中各点到质心的距离和，大小是1*5；
D是每个点到质心的位置，大小是89*1

PS：

matlab 的 kmeans 在聚类时确有不稳健的问题，但也不至于每次运算结果都不一样，除非你的数据个体数很多，和/或分的组数较大。另外，高版本的比低版本的功能也有所加强。

### 12 matlab计算运行时间

Matlab中计算程序运行时间的三种方法

1、tic和toc组合(使用最多的)

1.    tic

2.    。。。。。。。。。。

3.    toc

1.    % by dynamic of Matlab技术论坛

3.    % contact me matlabsky@gmail.com

4.    % 2009-08-18 12:08:47

5.    clc

6.    tic;%tic1

7.    t1=clock;

8.    for i=1:3

9.    tic ;%tic2

10.  t2=clock;

11.  pause(3*rand)

12.  %计算到上一次遇到tic的时间，换句话说就是每次循环的时间

13.  disp(['toc计算第',num2str(i),'次循环运行时间：',num2str(toc)]);

14.  %计算每次循环的时间

15.  disp(['etime计算第',num2str(i),'次循环运行时间：',num2str(etime(clock,t2))]);

16.  %计算程序总共的运行时间

17.  disp(['etime计算程序从开始到现在运行的时间:',num2str(etime(clock,t1))]);

18.  disp('======================================')

19.  end

20.  %计算此时到tic2的时间，由于最后一次遇到tic是在for循环的i=3时，所以计算的是最后一次循环的时间

21.  disp(['toc计算最后一次循环运行时间',num2str(toc)])

22.  disp(['etime程序总运行时间：',num2str(etime(clock,t1))]);

1.    toc计算第1次循环运行时间：2.5628

2.    etime计算第1次循环运行时间：2.562

3.    etime计算程序从开始到现在运行的时间:2.562

4.    ======================================

5.    toc计算第2次循环运行时间：2.8108

6.    etime计算第2次循环运行时间：2.813

7.    etime计算程序从开始到现在运行的时间:5.375

8.    ======================================

9.    toc计算第3次循环运行时间：2.0462

10.  etime计算第3次循环运行时间：2.046

11.  etime计算程序从开始到现在运行的时间:7.421

12.  ======================================

13.  toc计算最后一次循环运行时间2.0479

14.  etime程序总运行时间：7.421

2、etime(t1,t2)并和clock配合

1.    t1=clock;

2.    。。。。。。。。。。。

3.    t2=clock;

4.    etime(t2,t1)

3、cputime函数来完成

1.    t0=cputime

2.    。。。。。。。。。。。。。

3.    t1=cputime-t0

### 13 matlab取整数

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(3.12 -3.12)

ans =

0

>> round([3.12 -3.12])

ans =

3    -3

### 14 ma后缀文件的打开

mat数据格式是matlab的数据存储的标准格式。

matopen 打开mat文件
matclose 关闭mat文件
magetfp 取得mat文件的c语言句柄
matGetArray 取得一个数组

### 15 mean函数的用法

matlab中mean的用法
2011-11-29 14:47
http://hi.baidu.com/megachan/blog/item/61e1bb6cb7ab2de64316941b.html

M = mean(A)

M = mean(A,dim)

A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];
mean(A)
ans =
3.0000 4.5000 6.0000

mean(A,2)
ans =
2.0000
4.0000

6.0000
6.0000

mean(A)

mean(A,2)

### 16 SVRTrain函数

最近结合ACO和SVM做分类，于是仔细看了下svmtrain的help文档。现结合该doc文档，做简单整理，希望对

svm入门者有点帮助哦。

svmtrain：用于训练支持向量机分类器。语法格式如下：

SVMStruct = svmtrain(Training, Group)

SVMStruct = svmtrain(..., 'Kernel_Function', Kernel_FunctionValue, ...)

SVMStruct = svmtrain(..., 'RBF_Sigma', RBFSigmaValue, ...)

SVMStruct = svmtrain(..., 'Polyorder', PolyorderValue, ...)

SVMStruct = svmtrain(..., 'Mlp_Params', Mlp_ParamsValue, ...)

SVMStruct = svmtrain(..., 'Method', MethodValue, ...)

SVMStruct = svmtrain(..., 'SMO_Opts', SMO_OptsValue, ...)

SVMStruct = svmtrain(..., 'BoxConstraint', BoxConstraintValue, ...)

SVMStruct = svmtrain(..., 'Autoscale', AutoscaleValue, ...)

SVMStruct = svmtrain(..., 'Showplot', ShowplotValue, ...)

Training是一个M行N列的矩阵，M是样本数，N是特征维数。Group：是个列向量，表示样本对应的类别，用字符串表示（可以用数字或单个字符）。

classifier is returned in SVMStruct, a structure with the following fields. 'Kernel_Function', Kernel_FunctionValue,.......'Showplot', ShowplotValue这些在svmtrain中是可选项。他们在svmtrain中出现的顺序是无关紧要的。但必须成对出现，前面单引号里的是字符标记，后面给出的是对应的值。Kernel_FunctionValue 有如下些可选类别：

linear — Default. Linear kernel or dot product.
rbf — Gaussian Radial Basis Function kernel with a default scaling factor, sigma, of 1.
polynomial — Polynomial kernel with a default order of 3.
mlp — Multilayer Perceptron kernel with default scale and bias parameters of [1, -1].

如可通过如下来设定核函数为Gaussian Radial Basis Function kernel ：

SVMStruct = svmtrain(Training, Group, 'Kernel_Function', rbf)；

### 17 uigetfile函数

matlab编程中有时想调入电脑中的某个文件，这时不妨用windows传统的文件打开对话框试一试：

[filename, pathname] = uigetfile( ...
{'*.jpg;*.tif;*.png;*.gif','All Image Files';...
'*.*','All Files' },...
'请选择要修改的图片（可多选）', ...
'MultiSelect', 'on');

[FileName,PathName,FilterIndex] = uigetfile(FilterSpec,DialogTitle,DefaultName)

FileName：返回的文件名

PathName：返回的文件的路径名

FilterIndex：选择的文件类型

FilterSpec：文件类型设置

DialogTitle：打开对话框的标题

DefaultName：默认指向的文件名

1.最简单的形式，只设置了一种可选择的文件类型

[FileName,PathName] = uigetfile('*.m','Select the M-file');

2.设置多种文件类型

[filename, pathname] = ...
uigetfile({'*.m';'*.mdl';'*.mat';'*.*'},'File Selector');

3.可以为文件类型设置说明，注意书写格式

[filename, pathname] = uigetfile( ...
{'*.m;*.fig;*.mat;*.mdl','MATLAB Files (*.m,*.fig,*.mat,*.mdl)';
'*.m',  'M-files (*.m)'; ...
'*.fig','Figures (*.fig)'; ...
'*.mat','MAT-files (*.mat)'; ...
'*.mdl','Models (*.mdl)'; ...
'*.*',  'All Files (*.*)'}, ...
'Pick a file');

4.可返回选择的文件类型序号，并且可以设置文件多选，设置文件多选时注意，当只选了一个文件时，返回的filename为字符串，选择多个文件时，返回的元胞类型。

[filename, pathname, filterindex] = uigetfile( ...
{  '*.mat','MAT-files (*.mat)'; ...
'*.mdl','Models (*.mdl)'; ...
'*.*',  'All Files (*.*)'}, ...
'Pick a file', ...
'MultiSelect', 'on');

5.可以设置默认文件名

uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...
'*.*','All Files' },'mytitle',...
'C:\Work\myfile.jpg')

[filename, pathname] = uigetfile('*.m', 'Pick an M-file');
if isequal(filename,0)
disp('User selected Cancel')
else
disp(['User selected', fullfile(pathname, filename)])
end

fullfile的用法如下

f = fullfile('C:', 'Applications', 'matlab', 'myfun.m')
f = C:\Applications\matlab\myfun.m

%修改图片的大小
%%
clc
clear all
close all
%%
scale=inputdlg('缩放比(大于1为放大，小于1为缩小)','请输入缩放比',1,{'0.5'});
%%
[filename, pathname] = uigetfile( ...
{'*.jpg;*.tif;*.png;*.gif','All Image Files';...
'*.*','All Files' },...
'请选择要修改的图片（可多选）', ...
'MultiSelect', 'on');
%%
if ~iscell(filename)
filename1{1}=filename;
else
filename1=filename;
end
%%
for i=1:length(filename1)
image_resize=imresize(image,eval_r(scale{1}));
imwrite(image_resize,strcat(pathname,datestr(now, 'mmddHH'),filename1{i}));
end

prompt：输入文本框的标签

dlg_title：对话框的标题

num_lines：输入文本框的行数

defAns：默认的文本框内容

options：一些可选的对话框选项

prompt={'Enter the matrix size for x^2:',...
'Enter the colormap name:'};
name='Input for Peaks function';
numlines=1;

options.Resize='on';
options.WindowStyle='normal';
options.Interpreter='tex';

### 18 当聚类函数出现空集

Empty cluster created at iteration XXX

'emptyaction':'error'|'drop'|'singleton'

kmeans(X,2,'emptyaction','drop')

help kmeans

2018-03-16: 已经改造过了，之前的代码有点不堪入目。

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120