matlab基本函数

版权声明:欢迎转载,转载请说明出处https://csdn.yanxml.com。大数据Github项目地址https://github.com/SeanYanxml/bigdata。 https://blog.csdn.net/u010416101/article/details/40707843

经过多方的收集,对于matlab的基本函数也有了一定的理解。

下面我把这些函数整理如下,以防止我需要备用,或者给予其他的matlab初学者。

我是有一定的编程基础的,所以 matlab的学习较快,各位可以根据自己的实际情况选择。

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

1 bsxfun函数

函数功能:两个数组间元素逐个计算的二值操作
 
使用方法:C=bsxfun(fun,A,B)
 
两个数组A合B间元素逐个计算的二值操作,fun是函数句柄或者m文件,也可以为如下内置函数:
 
@plus 加
@minus 减
@times 数组乘《Simulink与信号处理》
@rdivide 左除
@ldivide 右除
@power 数组幂乘
@max 二值最大值
@min 二值最小值
@rem 余数
@mod 求模
@atan2 四象限反正切
@hypot 平方和的平方根
@eq 等于
@ne 不等于
@lt 小于www.iLoveMatlab.cn
@le 小于或等于
@gt 大于
@ge 大于或等于
@and 逻辑并
@or 逻辑或
@xor 逻辑异或
 
应用举例:
 
在此例子中,bsxfun函数用来计算矩阵A每一列减去其对应列的平均值.
 
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): 

该命令返回一个对于N个观察样本的K个fold(意为折,有“层”之类的含义,感觉还是英文意思更形象)的标记(indices)。该标记中含有相同(或者近似相同)比例的1—K的值,将样本分为K个相斥的子集。在K-fold交叉检验中,K-1个fold用来训练,剩下的一个用来测试。此过程循环K次,每次选取不同的fold作为测试集。K的缺省值为5。 使用程序: 

[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): 

该命令返回一个逻辑值的标记向量,从N个观察样本中随机选取(或近似于)P*N个样本作为测试集。故P应为0-1,缺省值为0.5。 使用程序: 

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

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

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

该命令返回一个逻辑值的标记向量,从N个观察样本中随机选取M个样本作为测试集。M的缺省值为1。值得注意的是,LeaveMOut在循环中使用不能保证产生的是互补集合,即每次循环的随机选取是独立的。如果要用互补的话还是使用Kfold命令。 使用程序: 

[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]): 

本函数为②的一个特殊情况。当我不想把P*N剩下的部分全部作为训练集的时候使用该函数,用Q指定一个比例,选取Q*N作为训练集。两个集合的选取以最小化交集为原则。

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)
在集合set中取subset个元素的所有组合
例如:在[2 3 5 9 7]中取3个元素的所有组合为:
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得到排列,用法:
perms(vector)
给出向量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

方法2例子2
命令:
combntns(set,subset)
在集合set中取subset个元素的所有组合
例如:在[2 3 5 9 7]中取3个元素的所有组合为:
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得到排列,用法:
perms(vector)
给出向量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判断矩阵相等

问题:
如何快速判断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

如果知道a,c可以通过列变换变得完全一样

解答1(最优):
这个看起来就是要判读是否只是列的顺序不同。如果是那样

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

解答2(最基本的思想)
比较笨一点的方法就是产生和a的列数相同的排列数,然后判断。
    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编程,如何将一矩阵中等于某个值的元素全部替换成另一个值?
我有个矩阵,里面有些元素为某一特定值,如1.5,请教如何将矩阵中等于1.5的元素全部置1.另外,如果特定的值为NaN,也能执行同样的操作么?
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

%about NaN
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
看到Incides了吗,这个是问题的关键,他把所有的点分成4类。数字一样的是一类,Indices=crossvalind('Kfold',8,4)中‘8’代表元素的个数,‘4’代表分成几类,因为有四类,每类应该有8/4两个元素,看indices中,每个相同的数字有两个元素,这样就能完成分类了。
正常都是需要循环4次,这里的‘4’和crossvalind中的参数‘4’是一样的。比如第一次循环令i=1;
得到indicies中是‘1’的,把其中的相应的设置为‘1’,其余的为零。
val_set_index=(Indices==1)
这个是对于test的(validation)验证
val_set_index =

     0
     0
     0
     1
     0
     1
     0
     0
 train_set_index=~val_set_index
这个是train的(训练分类器)
train_set_index =

     1
     1
     1
     0
     1
     0
     1
     1
这两个结果加在一起是一个全为1的向量。
若果我想提取其中的test,用下面语句:
>>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,…)
这其中的参数Param1、Param2等,主要可以设置为如下:

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);
我想把主成份分析后的结果SCORE(:,1:3),大小为89*3,聚成5类,我的理解的运行结果应该是:
IDX是1~5的整数,表示归到了那一类;
C是每一类的质心位置,大小是5*3;
sumd是每一类中各点到质心的距离和,大小是1*5;
D是每个点到质心的位置,大小是89*1

PS:

用它聚类,每次结果都不一样,是kmeans算法本身的缘故,还是MATLAB内部实现的BUG
应该是和初始值有关的~
初始值不同,聚类就不同~
matlab 的 kmeans 在聚类时确有不稳健的问题,但也不至于每次运算结果都不一样,除非你的数据个体数很多,和/或分的组数较大。另外,高版本的比低版本的功能也有所加强。
又及,聚类问题其实比人们想象的复杂得多,这主要涉及数据的标准化与否,所分组数的多寡,聚类的方法等等,都将使聚类结果有所改变。寻找最合适的聚类并非易事。

12 matlab计算运行时间

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

经常我们需要计算我们程序到底运行多长时间,这样可以比较程序的执行效率。当然这个对于只有几秒钟的小程序没有什么意义,但是对于大程序就有很重要的意义了。

下面我们就说说Matlab中计算程序运行时间的三种常用方法吧!

注意:三种方法由于使用原理不一样,得到结果可能有一定的差距!

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

计算tic和toc之间那段程序之间的运行时间,它的经典格式为

1.    tic

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

3.    toc

复制代码

换句话说程序,程序遇到tic时Matlab自动开始计时,运行到toc时自动计算此时与最近一次tic之间的时间。这个有点拗口,下面我们举个例子说明

1.    % by dynamic of Matlab技术论坛

2.    % see also http://www.matlabsky.com

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配合

来计算t1,t2之间的时间差,它是通过调用windows系统的时钟进行时间差计算得到运行时间的,应用的形式

1.    t1=clock;

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

3.    t2=clock;

4.    etime(t2,t1)

复制代码

至于例子我就不举了,因为在上面的例子中使用了etime函数了

3、cputime函数来完成

使用方法和etime相似,只是这个是使用cpu的主频计算的,和前面原理不同,使用格式如下

1.    t0=cputime

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

3.    t1=cputime-t0

复制代码

上面说到了三种方法,都是可以进行程序运行时间计算的,但是Matlab官方推荐使用tic/toc组合,When timingthe duration of an event, use the tic and toc functions instead of clock oretime.

至于大家可以根据自己的喜好自己选择,但是使用tic/toc的时候一定要注意,toc计算的是与最后一次运行的tic之间的时间,不是第一个tic,更不是第二个。。。。。

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的数据存储的标准格式。
你可以调用matlab的子程序库,用c或fortan调用mat格式的数据。
我给你几个函数名
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)
返回沿数组中不同维的元素的平均值。
如果A是一个向量,mean(A)返回A中元素的平均值。
如果A是一个矩阵,mean(A)将其中的各列视为向量,把矩阵中的每列看成一个向量,返回一个包含每一列所有元素的平均值的行向量。
如果A是一个多元数组,mean(A)将数组中第一个非单一维的值看成一个向量,返回每个向量的平均值。

M = mean(A,dim)
返回A中沿着标量dim指定的维数上的元素的平均值。对于矩阵,mean(A,2)就是包含每一行的平均值的列向量。
《Simulink与信号处理》
应用举例 编辑本段回目录

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)

当A为向量时,那么返回值为该向量所有元素的均值

当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(..., 'QuadProg_Opts', QuadProg_OptsValue, ...)

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.
    quadratic — Quadratic kernel.
    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:默认指向的文件名

例子:(接来自matlab的帮助)

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')

更多文件对话框,可参考matlab帮助。

一点小技巧:当返回了一个文件的时候,可以用fullfile将路径和文件名组合起来,如

[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=imread(strcat(pathname,filename1{i}));
    image_resize=imresize(image,eval_r(scale{1}));
    imwrite(image_resize,strcat(pathname,datestr(now, 'mmddHH'),filename1{i}));
end

其中的inputdlg函数实现一个要求用户输入信息的对话框,用法如下

answer = inputdlg(prompt,dlg_title,num_lines,defAns,options)

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;
defaultanswer={'20','hsv'};

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

answer=inputdlg(prompt,name,numlines,defaultanswer,options);

返回为字符串,如果想转化为数字,可以是使用函数eval。

另外input函数也可以实现用户信息输入,不过是在命令行中输入,也很简单、常用搜索。

18 当聚类函数出现空集

Empty cluster created at iteration XXX
是因为在分群的过程中有某些群落没有分配到任何的输入图样
最主要的原因在于各群的初始値设定不洽当
建议改进算法
或者设置kmeans遇到空群时的参数
默认参数是报错 就是楼主遇到的
'emptyaction':'error'|'drop'|'singleton'
上面是3个可选参数,分别对应 报错|丢弃空群|创建新群
如选用第2个参数可以这样调用
kmeans(X,2,'emptyaction','drop')
当然
还有其他一些参数
可用命令
help kmeans

最后:不当之处还请指出,转载请指出出处。谢谢!

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

阅读更多

扫码向博主提问

在风中的意志

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • Java
  • 大数据
去开通我的Chat快问
换一批

没有更多推荐了,返回首页