Ⅰ 如何在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目錄下的所有文件,這樣就可以正確訪問了。