Ⅰ 如何在matlab中添加SVM工具箱以及初次应用
一、因为要用到SVM,所以想先在matlab下学习一下,简短讲添加工具箱很简单:
1.1:如果是Matlab安装光盘上的工具箱,重新执行安装程序,选中即可。
1.2:如果是单独下载的工具箱,则需要把新的工具箱(以下假设工具箱名字为svm)解压到toolbox目录下,然后用addpath或者pathtool把该工具箱的路径添加到matlab的搜索路径中,
2:最后用which newtoolbox_command.m来检验是否可以访问。如果能够显示新设置的路径,则表明该工具箱可以使用了。
SVM工具箱:>> addpath('D:\Program Files\MATLAB\R2008a\toolbox\svm')
>> which svcinfo.m
D:\Program Files\MATLAB\R2008a\toolbox\svm\svcinfo.m
成功~
PS:还有一些其他方法,可以参考:http://blog.lehu.shu.e.cn/smallworker/A31135.html
二、初次使用,采用差仿http://zyy554221.blog.sohu.com/82115143.html中的例子,但是出现了错逗庆销误信息:D:…………\toolbox\svm\qp.dll 不是有效的 Win32 应用程序,经过搜索看到有很多人出现这个问题,貌似是因山游为matlab版本比较高。
解决办法:1、command中输入
>> cd 'D:\Program Files\MATLAB\R2008a\toolbox\svm\Optimiser'
>> mex -v qp.c pr_loqo.c
2、出现:
This is mex, Copyright 1984-2007 The MathWorks, Inc.
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2008a\sys\lcc\bin
[2] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio
[0] None
Compiler: (我选择了2),然后就出现很多东西……
3、Optimiser文件夹下看到两个文件:qp.dll.old和qp.mexw32;把qp.mexw32重命名为qp.dll覆盖svm文件夹下的qb.dll即可。
4,、然后应用例子,成功~~
Ⅱ 如何在MATLAB中添加SVM函数工具箱
打开matlab,点击HOME中的"Set Path"选项。
Ⅲ 怎么在libsvm安装包基础上进行特征加权
一 安装
1. 下载
在LIBSVM的主页上下载最新版本的软件包,并解压到合适目录中。
2. 编译
如果你使用的是64位的操作的系统和Matlab,那么不需要进行编译步骤,因为自带软件包中已经包含有64位编译好的版本:libsvmread.mexw64、libsvmwrite.mexw64、svmtrain.mexw64、svmpredict.mexw64。否则,需要自己编译二进制文件。
首先在Mtlab中进入LIBSVM根目录下的matlab目录(如C:\libsvm-3.17\matlab),在命令窗口输入
>>mex –setup
然后Matlab会提示你选择编译mex文件的C/C++编译器,就选择一个已安装的编译器,如Microsoft Visual C++ 2010。之后Matlab会提示确认选择的编译器,输入y进行确认。
然后可以输入以下命令进行编译。
>>make
注意,Matlab或VC版本过低可能会导致编译失败,建议使用最新的版本。
编译成功后,当前目录下会出现若干个后缀为mexw64(64位系统)或mexw32(32位系统)的文件。
3. 重命名(可选,但建议执行)
编译完成后,在当前目录下回出现svmtrain.mexw64、svmpredict.mexw64(64位系统)或者svmtrain.mexw32、svmpredict.mexw32(32位系统)这两个文件,把文件名svmtrain和svmpredict相应改成libsvmtrain和libsvmpredict。
这是因为Matlab中自带有SVM的工具箱,而且其函数名字就是svmtrain和svmpredict,和LIBSVM默认的名字一样,在实际使用的时候有时会产生一定的问题,比如想调用LIBSVM的变成了调用Matlab SVM。
如果有进行重命名的,以后使用LIBSVM时一律使用libsvmtrain和libsvmpredict这两个名字进行调用。
4. 添加路径
为了以后使用的方便,建议把LIBSVM的编译好的文件所在路径(如C:\libsvm-3.17\matlab)添加到Matlab的搜索路径中。具体操作为:(中文版Matlab对应进行)
HOME -> Set Path -> Add Folder -> 加入编译好的文件所在的路径(如C:\libsvm-3.17\matlab)
当然也可以把那4个编译好的文件复制到想要的地方,然后再把该路径添加到Matlab的搜索路径中。
二 测试
LIBSVM软件包中自带有测试数据,为软件包根目录下的heart_scale文件,可以用来测试LIBSVM是否安装成功。这里的heart_scale文件不能用Matlab的load进行读取,需要使用libsvmread读取。
进入LIBSVM的根目录运行以下代码(因为heart_scale文件没有被添加进搜索路径中,其他路径下无法访问这个文件):
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
model = libsvmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
[predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model);
如果LIBSVM安装正确的话,会出现以下的运行结果,显示正确率为86.6667%。
*
optimization finished, #iter = 134
nu = 0.433785
obj = -101.855060, rho = 0.426412
nSV = 130, nBSV = 107
Total nSV = 130
Accuracy = 86.6667% (234/270) (classification)
三 原理简介
使用SVM前首先得了解SVM的工作原理,简单介绍如下。
SVM(Support Vector Machine,支持向量机)是一种有监督的机器学习方法,可以学习不同类别的已知样本的特点,进而对未知的样本进行预测。
SVM本质上是一个二分类的算法,对于n维空间的输入样本,它寻找一个最优的分类超平面,使得两类样本在这个超平面下可以获得最好的分类效果。这个最优可以用两类样本中与这个超平面距离最近的点的距离来衡量,称为边缘距离,边缘距离越大,两类样本分得越开,SVM就是寻找最大边缘距离的超平面,这个可以通过求解一个以超平面参数为求解变量的优化问题获得解决。给定适当的约束条件,这是一个二次优化问题,可以通过用KKT条件求解对偶问题等方法进行求解。
对于不是线性可分的问题,就不能通过寻找最优分类超平面进行分类,SVM这时通过把n维空间的样本映射到更高维的空间中,使得在高维的空间上样本是线性可分的。在实际的算法中,SVM不需要真正地进行样本点的映射,因为算法中涉及到的高维空间的计算总是以内积的形式出现,而高维空间的内积可以通过在原本n维空间中求内积然后再进行一个变换得到,这里计算两个向量在隐式地映射到高维空间的内积的函数就叫做核函数。SVM根据问题性质和数据规模的不同可以选择不同的核函数。
虽然SVM本质上是二分类的分类器,但是可以扩展成多分类的分类器,常见的方法有一对多(one-versus-rest)和一对一(one-versus-one)。在一对多方法中,训练时依次把k类样本中的某个类别归为一类,其它剩下的归为另一类,使用二分类的SVM训练处一个二分类器,最后把得到的k个二分类器组成k分类器。对未知样本分类时,分别用这k个二分类器进行分类,将分类结果中出现最多的那个类别作为最终的分类结果。而一对一方法中,训练时对于任意两类样本都会训练一个二分类器,最终得到k*(k-1)/2个二分类器,共同组成k分类器。对未知样本分类时,使用所有的k*(k-1)/2个分类器进行分类,将出现最多的那个类别作为该样本最终的分类结果。
LIBSVM中的多分类就是根据一对一的方法实现的。
四 使用
关于LIBSVM在Matlab中的使用,可以参看软件包中matlab目录下的README文件,这里对里面内容做一个翻译和一些细节的讲解。
1. 训练
libsvm函数用于对训练集的数据进行训练,得到训练好的模型。
model = libsvmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);
这个函数有三个参数,其中
-training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。
-training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
-libsvm_options:训练的参数,在第3点详细介绍。
2. 预测
libpredict函数用于对测试集的数据进行测试,还能对未知样本进行预测。
[predicted_label, accuracy, decision_values/prob_estimates]
= libsvmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);
这个函数包括四个参数,其中
-testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。
-testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
-model:使用libsvmtrain返回的模型
-libsvm_options:预测的参数,与训练的参数形式一样。
3. 训练的参数
LIBSVM训练时可以选择的参数很多,包括:
-s svm类型:SVM设置类型(默认0)
0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性核函数:u’v
1 – 多项式核函数:(r*u’v + coef0)^degree
2 – RBF(径向基)核函数:exp(-r|u-v|^2)
3 – sigmoid核函数:tanh(r*u’v + coef0)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
-p p:设置e -SVR 中损失函数p的值(默认0.1)
-m cachesize:设置cache内存大小,以MB为单位(默认40)
-e eps:设置允许的终止判据(默认0.001)
-h shrinking:是否使用启发式,0或1(默认1)
-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
4. 训练返回的内容
libsvmtrain函数返回训练好的SVM分类器模型,可以用来对未知的样本进行预测。这个模型是一个结构体,包含以下成员:
-Parameters: 一个5 x 1的矩阵,从上到下依次表示:
-s SVM类型(默认0);
-t 核函数类型(默认2)
-d 核函数中的degree设置(针对多项式核函数)(默认3);
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);
-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。
-totalSV: 表示支持向量的总数。
-rho: 决策函数wx+b中的常数项的相反数(-b)。
-Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
-ProbA: 使用-b参数时用于概率估计的数值,否则为空。
-ProbB: 使用-b参数时用于概率估计的数值,否则为空。
-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。
-sv_coef: 表示每个支持向量在决策函数中的系数。
-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。
另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。
5. 预测返回的内容
libsvmtrain函数有三个返回值,不需要的值在Matlab可以用~进行代替。
-predicted_label:第一个返回值,表示样本的预测类标号。
-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。
-decision_values/prob_estimates:第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。
6. 读取或保存
libsvmread函数可以读取以LIBSVM格式存储的数据文件。
[label_vector, instance_matrix] = libsvmread(‘data.txt’);
这个函数输入的是文件的名字,输出为样本的类标和对应的特征。
libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。
libsvmwrite(‘data.txt’, label_vector, instance_matrix]
这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。
五 更新:svdd扩展安装(2014.10)
从libsvm官网下载svdd工具箱,目前使用libsvm3.18以及svdd3.18版本。
svdd工具箱里面有一个matlab文件夹和3个文件svm.cpp、svm.h、svm-train.c。
将matlab文件夹中的文件svmtrain.c覆盖原libsvm的matlab文件夹中的文件。
将svm.cpp、svm.h、svm-train.c这3个文件覆盖libsvm文件夹下的相同文件。
按本文刚开始讲述的方法进行mex -setup、make等完成安装,根据需要进行改名以及添加Path。
Ⅳ matlab2011 如何添加工具箱
如果是Matlab安装光盘上的工具箱,重新执行安装程序,选中即可。如果是单独下载的工具箱,则需要把新的工具箱(以下假设工具箱名字为svm)解压到toolbox目录下,然后用addpath或者pathtool把该工具箱的路径添加到matlab的搜索路径中,最后用which newtoolbox_command.m来检验是否可以访问。如果能够显示新设置的路径,则表明该工具箱可以使用了。具体请看工具箱自己代的README文件。
1.1 举例:
要添加的工具箱为svm,则解压后,里边有一个目录svm,假设matlab安装在D:\MATLAB6p5,将svm目录拷贝至D:\MATLAB6p5\toolbox,然后运行matlab,在命令窗口输入addpath D:\MATLAB6p5\toolbox\svm回车,来添加路径。然后在svm目录下,任意找一个m文件,以svcinfo.m为例,在命令窗口中输入which svcinfo.m。如果显示出该文件路径,如 D:\MATLAB6p5\toolbox\svm\svcinfo.m,则安装成功,当然也可以在命令窗口输入path来查看。
上面的说明和例子基本上介绍了在matlab中如何添加工具箱,下面是其他补充:
1.2 添加方式总结:
事实上,有两种添加工具箱到matlab搜索路径的方法:其一是用代码,其二是用界面。其实无论用哪种方法,都是修改pathdef.m这个文件,阁下如果是高手,可以直接打开该文件修改,呵呵,对此这里不作讨论。
1.2.1 代码方式:
1.2.1.1 适用于添加下载的工具箱(别人的):
在命令窗口输入addpath D:\MATLAB6p5\toolbox\svm 或者addpath(‘D:\MATLAB6p5\toolbox\svm’);
但是这种方法只能添加svm目录,如果该目录下有其他子文件夹,并且运行时候“隐式”调用到这些子文件夹(例如假设svm目录下存在子文件夹matdata,该子文件夹下有logo.mat这个文件,且在m文件代码中使用了诸如 load logo 这样的句子,即没有显式给出logo.mat的具体路径,则称为“隐式”),则不能正确访问。因此,有必要在添加时使用以下语句把svm目录下所有文件夹都添加到搜索路径中:
Ⅳ 如何在MATLAB中添加SVM函数工具箱
目的:SVM_SteveGunn添加至我的matlab工具箱内
工具/原料:Matlab 2013B 、SVM工具箱
操作步骤:
1、下载svm工具包
地址:http://www.pudn.com/downloads343/sourcecode/math/detail1499382.html
2、解压工具包到E:\matlab\toolbox ,也可以解压后自己命名后复制过去。 (安装目录)
3、打开matlab点击set path---->add folder(也可以选择下面的addwithsubfolder) 然后把你的工具箱文件夹添加进去就可以了,保存。
4、刷新路径,这一步一定要做,路径加进去后在file→Preferences→General的Toolbox Path Caching里点击update Toolbox Path Cache更新一下。
5、验证是否添加成功,最后在matlab的命令栏中输入which svcoutput可以查看路径E:\matlab\toolbox\svm\svcoutput.m就可以了。
6、调用工具箱:
用SVM做分类的使用方法
1)在matlab中输入必要的参数:X,Y,ker,C,p1,p2
我做的测试中取的数据为:
N = 50;
n=2*N;
randn('state',6);
x1 = randn(2,N)
y1 = ones(1,N);
x2 = 5+randn(2,N);
y2 = -ones(1,N);
figure;
plot(x1(1,:),x1(2,:),'bx',x2(1,:),x2(2,:),'k.');
axis([-3 8 -3 8]);
title('C-SVC')
hold on;
X1 = [x1,x2];
Y1 = [y1,y2];
X=X1';
Y=Y1';
其中,X是100*2的矩阵,Y是100*1的矩阵
C=Inf;
ker='linear';
global p1 p2
p1=3;
p2=1;
然后,在matlab中输入:[nsv alpha bias] = svc(X,Y,ker,C),回车之后,会显示:
Support Vector Classification
_____________________________
Constructing ...
Optimising ...
Execution time: 1.9 seconds
Status : OPTIMAL_SOLUTION
|w0|^2 : 0.418414
Margin : 3.091912
Sum alpha : 0.418414
Support Vectors : 3 (3.0%)
nsv =
3
alpha =
0.0000
0.0000
0.0000
0.0000
0.0000
2)输入预测函数,可以得到与预想的分类结果进行比较.
输入:predictedY = svcoutput(X,Y,X,ker,alpha,bias),回车后得到:
predictedY =
1
1
1
1
1
1
1
1
1
3)画图
输入:svcplot(X,Y,ker,alpha,bias),回车
补充:
X和Y为数据,m*n:m为样本数,n为特征向量数
比如:取20组训练数据X,10组有故障,10组无故障的,每个训练数据有13个特征参数,则m=20,n=13
Y为20*1的矩阵,其中,10组为1,10组为-1.
对于测试数据中,如果取6组测试数据,3组有故障,3组无故障的,则m=6,n=13
Y中,m=6,n=1
可能出现的问题:
1.今天我在使用SVM通用工具箱对眼电的信号数据进行分类时出现如下错误:
Support Vector Classification
_____________________________
Constructing ...
Optimising ...
??? Dimension error (arg 3 and later).
Error in ==> svc at 60
[alpha lambda how] = qp(H, c, A, b, vlb, vub, x0, neqcstr);
Ⅵ 怎么在matlab平台上安装ls svmlab这个工具箱
第一步:首先将解压得到的文件夹拷贝到自己MATLAB的安装目录下,如
C:\Program Files\MATLAB\R2012b\toolbox\LSSVMlabv1_8_R2009b_R2011a
第二步:打开MATLAB,如果是Matlab7.0的话单击File,如何是2012的话在home面板上,靠近Layout那里有Set Path,然后选择Set Path这一选项,这时会出现Set Path的窗口,点击 Add Folder。。。将刚才拷贝到目录下的那个文件夹添加进来,点击Save,然后close。
第三步:检验工具箱是否添加成功:在MATLAB 的命令窗口中输入:
which tunelssvm.m
如果出现下面的情况:
>> which tunelssvm.m
C:\Program Files\MATLAB\R2012b\toolbox\LSSVMlabv1_8_R2009b_R2011a\tunelssvm.m
则表示安装成功。
Ⅶ 怎么往matlab中添加工具箱
下载一个工具箱,添加到matlab中,直接运用:
在matlab的file下面的set path把它加上,把路径加进去后在
file→Preferences→General的Toolbox Path Caching里点击update Toolbox Path Cache更新一下,就OK了
1.1 如果是Matlab安装光盘上的工具箱,重新执行安装程序,选中即可;
1.2 如果是单独下载的工具箱,一般情况下仅需要把新的工具箱解压到某个目录。
2 在matlab的file下面的set path把它加上。
3 把路径加进去后在file→Preferences→General的Toolbox Path Caching里点击update Toolbox Path Cache更新一下。
4 用which newtoolbox_command.m来检验是否可以访问。如果能够显示新设置的路径,则表明该工具箱可以使用了。
或者将工具箱复制到toolbox目录然后在set path里面添加这个目录就可以用了。
在matlab的file下面的set path把它加上,把路径加进去后在
file→Preferences→General的Toolbox Path Caching里点击update Toolbox Path Cache更新一下,就OK了
以下是我在别的地方看到的,转过来你参考一下吧。
首先说说添加到matlab搜索路径好处:1
对
n——你只需要存储一个副本,就可以在其他地方使用。具体来说,假设你在数据盘D上新建了两个目录abc和def,这两个工程(每个目录下的所有程序相应地称为一个工程)都需要调用同一个(些)函数(简称工具箱),这时候,如果你没有把该工具箱添加到matlab的搜索路径下,则需要分别把工具箱中所有用到的文件都复制到目录abc和def下才能正确运行。这显然浪费空间,所以,matlab提供了一个搜索路径(默认在matlab安装目录下的toolbox中),只要把工具箱对应的整个文件夹复制到搜索路径对应的目录下,并且通知matlab一声(把该路径正确添加到搜索路径中),就可以在abc和def中使用这个工具箱了(即无论你的工程文件在哪个目录(有效的目录)下都可以访问这个工具箱中的函数)。下面就以matlab安装目录下的toolbox目录作为默认的添加路径进行详细说明。
1. 如何添加工具箱看
以下是添加工具箱的方法:(论坛很多人转载过,这里就不作区分了,下面的举例也一样)
如果是Matlab安装光盘上的工具箱,重新执行安装程序,选中即可。如果是单独下载的工具箱,则需要把新的工具箱(以下假设工具箱名字为svm)解压到toolbox目录下,然后用addpath或者pathtool把该工具箱的路径添加到matlab的搜索路径中,最后用which
newtoolbox_command.m来检验是否可以访问。如果能够显示新设置的路径,则表明该工具箱可以使用了。具体请看工具箱自己代的README文件。
1.1 举例:
要添加的工具箱为svm,则解压后,里边有一个目录svm,假设matlab安装在D:\MATLAB6p5,将svm目录拷贝至D:\MATLAB6p5\toolbox,然后运行matlab,在命令窗口输入addpath
D:\MATLAB6p5\toolbox\svm回车,来添加路径。然后在svm目录下,任意找一个m文件,以svcinfo.m为例,在命令窗口中输入which
svcinfo.m。如果显示出该文件路径,如
D:\MATLAB6p5\toolbox\svm\svcinfo.m,则安装成功,当然也可以在命令窗口输入path来查看。
上面的说明和例子基本上介绍了在matlab中如何添加工具箱,下面是其他补充:
1.2 添加方式总结:
事实上,有两种添加工具箱到matlab搜索路径的方法:其一是用代码,其二是用界面。其实无论用哪种方法,都是修改pathdef.m这个文件,阁下如果是高手,可以直接打开该文件修改,呵呵,对此这里不作讨论。
1.2.1 代码方式:
1.2.1.1 适用于添加下载的工具箱(别人的):
在命令窗口输入addpath D:\MATLAB6p5\toolbox\svm 或者addpath(‘D:\MATLAB6p5\toolbox\svm’);
但是这种方法只能添加svm目录,如果该目录下有其他子文件夹,并且运行时候逗隐式地调用到这些子文件夹(例如假设svm目录下存在子文件夹matdata,该子文件夹下有logo.mat这个文件,且在m文件代码中使用了诸如
load logo
这样的句子,即没有显式给出logo.mat的具体路径,则称为逗隐式地),则不能正确访问。因此,有必要在添加时使用以下语句把svm目录下所有文件夹都添加到搜索路径中:
500){this.resized=true;this.style.width=500;}"> 程序代码
addpath(genpath(D:\MATLAB6p5\toolbox\svm));
另外,如果只使用以上代码,则退出matlab后,新添加的路径不会被保存下来,下次重新启动matlab后又需要重新添加。可以用savepath来解决这个问题,即在命令窗口中使用
savepath 便可。不过保存路径操作只对matlab
2006a、2006b有效(应该对版本7.0以上的都有效,因没有测试,所以不敢肯定),对6.5版本的matlab无效(该版本没有savepath这个命令)。
1.2.1.2 适用于添加自己的工具箱(即工具箱自己编写,然后希望别人下载后当运行主文件时自动把路径添加到matlab搜索路径中):
在主文件中加入如下代码;
500){this.resized=true;this.style.width=500;}"> 程序代码
sCurrPath = fileparts(mfilename('fullpath'));
addpath(genpath(sCurrPath)); %如果该工具箱没有其他子目录,则可以不需要用genpath
savepath; %这句可根据各人需要自行选择,相信上一节的解释已经很清楚
1.2.2 界面方式:
首先把主界面调出来,有两种方式,一种是在命令窗口输入pathtool,另一种是在matlab菜单调用(File
-> Set Path…)。打开主界面后,相信不用太多解释了。Add Folder… 或者 Add with subfolders…
就可以了,添加完毕后,如果需要保存该路径,则在close前save一下就可以了。
这种方式的好处是如果路径有问题,matlab会马上报错,告诉用户添加失败。
2 工具箱添加失败:
2.1 work目录和toolbox目录问题:
你当然可以单独把一个或多个文件(不含文件夹)放在work目录下来实现逗1对n地,因为work目录是其中一个matlab默认的搜索路径,但显然不能包含文件夹,如果包含文件夹,则同样需要把该文件夹添加到搜索路径中。相反,你不能单独把一个或多个文件(不含文件夹)放在toolbox目录下来实现逗1对n地,因为toolbox这个目录并非matlab的一个默认搜索路径,除非你把toolbox文件夹添加到搜索路径中。
2.2 由于路径名称而导致添加失败的总结:
2.2.1 路径存在空格:
错误:addpath C:\Program Files\MATLAB\R2006b\toolbox\finity
正确:addpath(‘C:\Program Files\MATLAB\R2006b\toolbox\finity’) 或者使用界面方式添加
说明:在6.5版本的matlab不推荐使用带空格的路径,因为matlab6.5的安装路径是不允许有空格的,因此不晓得带空格的工具箱路径会出现什么问题。7.0以上应该没有问题。
界面方式则估计没有问题,有问题matlab会自动报错的。
2.2.2 路径存在中文:
用addpath和界面方式均可以成功添加,但不推荐,最好使用英文路径。
2.2.3 路径存在逗@地字符:
均不成功,不要使用逗@地字符
小结:出现其他与添加相关的错误时,用标准的路径和文件名试试吧。
3 正确添加了工具箱,但运行调用时出错:
3.1 版本问题:
对于工具箱检测到matlab版本不兼容的问题,先引用一下happy教授的回复:
=====================happy================================
这个是有用的,估计是作者考虑到随着matlab的升级会出现不兼容的问题,因此加了类似的设置error('unsupported
matlab version. please send an
email.');以提示大家。从这一设置上看4.x和5.x版本的是完全没有问题的,之后的版本可能会出现问题,是否真的会出现需要进行测试
=========================================================
我也遇到过这类问题(如3.3节提到的spm5,下载得到的文件如果遇到2006版本的matlab则无法成功运行),但不是matlab的直接回复说逗版本不支持地,而是普通的语法出错。我的经验是根据错误提示调试一下,看看问题出在哪里,然后再对程序作相应修改。例如在我的问题中,由于不支持最新的版本,所以2006a和2006b版本分别用下面的语句进行检查:strcmp(version('-release'),'2006a')
和 strcmp(version('-release'),'2006b')。
3.2 程序中其他语法错误:
估计部分语法不兼容,例如7.0版本以上的matlab可以使用&&、||、@(x)等等之类的符号,但是在6.5版本下无效,这种错误也需要自己手动修改一下代码。
3.3 工具箱中的函数重名问题:
Happy教授也提到过,除了改名,没有太好的办法。但是如果改的地方不止一个,例如遇到该文件进行了多次的自我调用(一个典型例子是以switch
和case语句进行区分不同的操作),或者其他文件存在对该文件的调用时,这是个很头痛的事情。根据我的经验,也没有找到太好的解决办法。以我所用的两个工具箱为例,它们的文件夹名字不同(一个是spm2,一个是spm5),但是里面的主m文件名字都一样,为spm.m,如果两个工具箱同处于matlab的搜索路径中,会导致其中一个工具箱失效,更别说两者之间通过切换来进行调用了。我一般的解决方法是安装两个matlab,例如一个是6.5版,一个是2006版,把两个工具箱分别添加到不同的matlab中,这样就可以启动不同版本的matlab使用不同版本的工具箱了,呵呵,算是一个补救的方法吧。
3.4 找不到m文件的问题:
如果你已经把工具箱正确添加到搜索路径下,这种情况一般不会发生。也就是说,通过逗文件夹
-> 运行matlab
->添加路径地步骤后,该文件夹下所有文件应该都可以访问到。但是,当你对该文件夹下的m文件更新(包括修改和新增)了以后,此时如果你不重启matlab,则可能会出现找不到m文件的问题(特别是该工具箱中的文件没有依赖关系,它们只是被放在一起方便调用,当你新增一个m文件到该文件夹下而不重启matlab的时候,会造成这一新增m文件访问失败)。解决这个问题的方法之一显然是重启matlab,如果你不想重启,也可用第二个方法:在命令窗口输入:
rehash toolbox ,逗强制地matlab刷新toolbox目录下的所有文件,这样就可以正确访问了。