❶ 如何創建enums類型在MATLAB
1. 你可以得到與新型MATLAB的類的函數:
classdef (Sealed) Colors
properties (Constant)
RED = 1;
GREEN = 2;
BLUE = 3;
end
methods (Access = private) % private so that you cant instantiate
function out = Colors
end
end
end
這是不是一個真正的類型,但由於MATLAB是弱類型,如果整數,你可以做的事情,它近似:
line1 = Colors.RED;
...
if Colors.BLUE == line1
end
在這種情況下,MATLAB「enums」是接近C樣式enums-為整數代替語法。
隨著你甚至可以使MATLAB的enums接近阿達在復雜,但不幸的是與awk的語法。
2.
從R2010b中開始 CodeGo.net,MATLAB支持
從示例
classdef Colors
properties
R = 0;
G = 0;
B = 0;
end
methods
function c = Colors(r, g, b)
c.R = r; c.G = g; c.B = b;
end
end
enumeration
Red (1, 0, 0)
Green (0, 1, 0)
Blue (0, 0, 1)
end
end
3.
你可以從你的Matlab代碼Java的enums類。定義它們在Java中,並把它們放在你的Matlab的javaclasspath。
// Java class definition
package test;
public enum ColorEnum {
RED, GREEN, BLUE
}
您可以在M-代碼中引用它們通過。
mycolor = test.ColorEnum.RED
if mycolor == test.ColorEnum.RED
disp('got red');
else
disp('got other color');
end
% Use ordinal() to get a primitive you can use in a switch statement
switch mycolor.ordinal
case test.ColorEnum.BLUE.ordinal
disp('blue');
otherwise
disp(sprintf('other color: %s', char(mycolor.toString())))
end
它不會對其他類型的,雖然。字元串有一個奇怪的回報大小。
>> test.ColorEnum.RED == 'GREEN'
ans =
0
>> test.ColorEnum.RED == 'RED'
ans =
1 1 1
4.
如果你想要做類似於馬克建議,您可以直接使用一個結構來表示你的類型,而不是一個全新的類:
colors = struct('RED',1,'GREEN',2,'BLUE',3);
一個好處是,你可以輕松地訪問結構兩種不同的方式。您可以指定一個域的域
a = colors.RED;
或者你充滿活力的領域,如果你有一個字元串欄位:
a = colors.('RED');
事實上,有幾個好處,做什麼馬克建議,創造一個全新的類來表示一個「enums」對象:
您可以控制如何在對象被修改。
你可以把定義在一個地方,它在多個地方。
您可以控制的失敗,使他們更「優雅」,像返回一個空矩陣,如果你試圖訪問一個不存在的欄位(而不是拋出一個錯誤)。
但是,如果你不需要那種,只是需要做的快,結構很可能是最簡單,最直接的它也將與舊版本的MATLAB的工作,唐「最新的OOP
5.
其實是在MATLAB R2009b關鍵字叫做'。這似乎是,我不能說我知道是怎麼回事,但函數卻可能存在。
你可以找到它在matlabroot\toolbox\distcomp\examples\+examplesclassdef(Enumeration) DmatFileMode < int32
enumeration
ReadMode(0)
ReadCompatibilityMode(1)
WriteMode(2)
end
<snip>
end
6.
你可以做一個matlab的類,它的行為就像一個Java的老類型安全enums模式。馬克的解決方案的修改可以把它從C樣式的類型定義,更像是Java樣式的類型安全enums。在這個版本中,常量的值類型顏色的對象。
有利的一面:
該類型可以進行檢查(在由==等操作,以防止對生的或其他類型的enums。
你可以明確地檢查你的變數的類型(在
值顯示與可讀性,而不是不透明的代碼。
操作和std()不就enums意義是不允許的。
缺點:
較長的類定義。但是,這是所有的樣板,並且可以用於任何其他enums類,只需改變類和常量屬性。
這些enums在switch塊不能直接。需要彈出的代碼了,失去了類型安全。
對象會比原語慢。相關的,如果你在循環中的常量。
整體來說,我不知道哪種方式更好。避風港「無論是在實踐中。
classdef (Sealed) Color
%COLOR Example of Java-style typesafe enum for Matlab
properties (Constant)
RED = Color(1, 'RED');
GREEN = Color(2, 'GREEN');
BLUE = Color(3, 'BLUE');
end
properties (SetAccess=private)
% All these properties are immutable.
Code;
Name;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
methods (Access = private)
%private so that you can't instatiate directly
function out = Color(InCode, InName)
out.Code = InCode;
out.Name = InName;
end
end
methods (Static = true)
function needa(obj)
%NEEDA Asserts that obj must be a Color
if ~isa(obj, mfilename)
error('Input must be a %s; got a %s', mfilename, class(obj));
end
end
end
methods (Access = public)
function display(obj)
disp([inputname(1) ' =']);
disp(obj);
end
function disp(obj)
if isscalar(obj)
disp(sprintf('%s: %s (%d)', class(obj), obj.Name, obj.Code));
else
disp(sprintf('%s array: size %s', class(obj), mat2str(size(obj))));
end
end
function out = eq(a, b)
%EQ Basic "type-safe" eq
check_type_safety(a, b);
out = [a.Code] == [b.Code];
end
function [tf,loc] = ismember(a, b)
check_type_safety(a, b);
[tf,loc] = ismember([a.Code], [b.Code]);
end
function check_type_safety(varargin)
%CHECK_TYPE_SAFETY Check that all inputs are of this enum type
for i = 1:nargin
if ~isa(varargin{i}, mfilename)
error('Non-typesafe comparison of %s vs. %s', mfilename, class(varargin{i}));
end
end
end
end
end
這里有一個函數來行使它。
function do_stuff_with_color(c)
%DO_STUFF_WITH_COLOR Demo use of the Color typesafe enum
Color.needa(c); % Make sure input was a color
if (c == Color.BLUE)
disp('color was blue');
else
disp('color was not blue');
end
% To work with switch statements, you have to explicitly pop the code out
switch c.Code
case Color.BLUE.Code
disp('blue');
otherwise
disp(sprintf('some other color: %s', c.Name));
end
例子
>> Color.RED == Color.RED
ans =
1
>> Color.RED == 1
??? Error using ==> Color>Color.check_type_safety at 55
Non-typesafe comparison of Color vs. double
Error in ==> Color>Color.eq at 44
check_type_safety(a, b);
>> do_stuff_with_color(Color.BLUE)
color was blue
blue
>> do_stuff_with_color(Color.GREEN)
color was not blue
some other color: GREEN
>> do_stuff_with_color(1+1) % oops - passing the wrong type, should error
??? Error using ==> Color>Color.needa at 26
Input must be a Color; got a double
Error in ==> do_stuff_with_color at 4
Color.needa(c); % Make sure input was a color
>>
A小調怪癖的兩種方法:把常數上的「==」,以防止不良左手的C約定不幫助盡可能多的在這里。在Matlab中,如果你「=」用這個常數,而不是一個錯誤在LHS,但只需要建立一個新的局部結構變數的顏色,它會掩蓋enums類。
>> Colors.BLUE = 42
Colors =
BLUE: 42
>> Color.BLUE = 42
Color =
BLUE: 42
>> Color.RED
??? Reference to non-existent field 'RED'.
7.
在嘗試了這個頁面上的其他建議,我降落在安德魯的完全面向對象的方法。很不錯的-感謝安德魯。
萬一有人有興趣,不過,我做了(我認為是)特別是,我刪除了需要雙擊指定的enums對象。在現在是反思和系統。此外,式()和函數進行了重新編寫,以回
饋為enums對象的矩陣妥善形的返回值。最後,check_type_safety()函數進行了修改,使與包的目錄(例如,
似乎很好地工作,但知道你在想什麼:
classdef (Sealed) Color
%COLOR Example of Java-style typesafe enum for Matlab
properties (Constant)
RED = Color(1);
GREEN = Color(2);
BLUE = Color(3);
end
methods (Access = private) % private so that you can''t instatiate directly
function out = Color(InCode)
out.Code = InCode;
end
end
% ============================================================================
% Everything from here down is completely boilerplate - no need to change anything.
% ============================================================================
properties (SetAccess=private) % All these properties are immutable.
Code;
end
properties (Dependent, SetAccess=private)
Name;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
methods
function out = eq(a, b) %EQ Basic "type-safe" eq
check_type_safety(a, b);
out = reshape([a.Code],size(a)) == reshape([b.Code],size(b));
end
function [tf,loc] = ismember(a, b)
check_type_safety(a, b);
[tf,loc] = ismember(reshape([a.Code],size(a)), [b.Code]);
end
function check_type_safety(varargin) %CHECK_TYPE_SAFETY Check that all inputs are of this enum type
theClass = class(varargin{1});
for ii = 2:nargin
if ~isa(varargin{ii}, theClass)
error('Non-typesafe comparison of %s vs. %s', theClass, class(varargin{ii}));
end
end
end
% Display stuff:
function display(obj)
disp([inputname(1) ' =']);
disp(obj);
end
function disp(obj)
if isscalar(obj)
fprintf('%s: %s (%d)\n', class(obj), obj.Name, obj.Code);
else
fprintf('%s array: size %s\n', class(obj), mat2str(size(obj)));
end
end
function name=get.Name(obj)
mc=metaclass(obj);
mp=mc.Properties;
for ii=1:length(mp)
if (mp{ii}.Constant && isequal(obj.(mp{ii}.Name).Code,obj.Code))
name = mp{ii}.Name;
return;
end;
end;
error('Unable to find a %s value of %d',class(obj),obj.Code);
end;
end
end
謝謝,
石匠
8.
如果您可以訪問統計工具箱,你可能一個明確的對象。
9.
Toys = {'Buzz', 'Woody', 'Rex', 'Hamm'};
Toys{3}
ans = 'Rex'
10.
如果你需要的類型只是傳遞到C#或.NET程序集,
您可以構建並通過使用MATLAB 2010enums:
A = NET.addAssembly(MyName.dll)
% suppose you have enum called "MyAlerts" in your assembly
myvar = MyName.MyAlerts.('value_1');
您也可以檢查MathWorks公司正式在答案
怎麼做的。在MATLAB 7.8 NET的值(R2009a)?
// the enum "MyAlerts" in c# will look something like this
public enum MyAlerts
{
value_1 = 0,
value_2 = 1,
MyAlerts_Count = 2,
}
❷ C#怎麼把外部引用的dll中的控制項加到工具箱中
http://blog.csdn.net/michael850711/article/details/4288882
主要看看第一步跟第四步。
添加控制項前最好右鍵添加一個空間組,這樣你專的第三方控制項就都在一起屬了。
CSkin是dll的名稱,CCWin是命名空間的名稱。他們沒有必然的聯系,一個dll可能含有多個命名空間。
❸ 怎麼往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目錄下的所有文件,這樣就可以正確訪問了。
❹ 農業銀行網上銀行枚舉控制項怎麼安裝
登錄農行網上銀行的個人網銀登錄 工具箱里就可以下載安裝
❺ 如何在VS中添加CSkin到工具箱
從「項目」菜單找到「添加引用」。「添加引用」應該那個菜單的下面吧?/111010000000/pic/item/f01389391367a4e53b87ce5b.jpg如果沒內有,按「管理員」模式啟容動程序。然後找到需要的控制項,添加即可。
❻ 如何向MATLAB中添加新工具箱
今天費了好大的勁終於將SVM_SteveGunn添加至我的matlab工具箱內,並且已能成功運行,現在把在添加以及運行中出現的各種問題羅列如下,並一一解決:
1、將下載的svm工具箱添加至matlab安裝目錄下
1、單獨下載的工具箱
2、把新的工具箱拷貝到某個目錄(我的是D:softmatlab2011b oolbox)。
注意:你要是添加的很多個m文件,那就把這些m文件直接拷到再下一層你想要的工具箱的文件夾里
例如,我要添加的是支持向量機工具箱,在剛才的文件夾下我已經有svm(支持向量機工具箱)文件夾了,但有的m文件還沒有,我就把新的m文件統統拷到D:softmatlab2011b oolbox svm目錄下了。如果你連某工具箱(你打算添加的)的文件夾都沒有,那就把文件夾和文件一起拷到D:softmatlab2011b oolbox 下。
先把工具箱保存到MATLAB安裝目錄的根目錄下面,然後運行matlab---->file---->set path---->add folder 然後把你的工具箱文件夾添加進去就可以了
3、在matlab的菜單file下面的set path把它( D:softmatlab2011b oolbox svm )加上。
4、 把路徑加進去後在file→Preferences→General的Toolbox Path Caching里點擊update Toolbox Path Cache更新一下。
記得一定要更新!我就是沒更新,所以添加了路徑,一運行還是不行。後來更新了才行。
2、在對svm工具箱進行使用時,發現了'qp.dll 不是有效的 Win32 應用程序 '
問題描述:
mex在不同windows OS下編譯的結果,所以我們需要重新編譯一下qp.dll
解決方案:
steve gunn 的包下面有一個optimiser 文件夾,把current Diretory目錄改為optimiser目錄,例如E:matlabProgramSVM_SteveGunnOptimiser,然後運行命令
>> mex -v qp.c pr_loqo.c
命令運行完畢後,你會發現原先的qp.dll變為qp.dll.old,還出現了qp.mexw32,我們把該文件改為qp.dll 復制到工具箱文件夾下。原先的工具箱文件qp.dll可以先改一下名字...
3、我在運行第二步時發現了『D:SOFTMATLAB~3BINMEX.PL: Error: Compile of 'qp.c' failed. Error using mex (line 206)
Unable to complete successfully.
這個是因為編譯器設置的問題,這里需要重新選擇設置編譯器,設置編譯器的方法:
mex -setup(mex和-setup之間要有空格),然後我選擇的VS2010,然後再繼續運行步驟2就成功了。
❼ vs2008 如何從工具箱添加enum枚舉
先生成類視圖,工具箱就可以添加枚舉了。
❽ 如何增加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目錄下的所有文件,這樣就可以正確訪問了。
❾ 如何動態添加控制項,vc++實現,有點類似於MFC裡面的工具箱。
控制項也是窗口,API 中 CreateWindow就是了,MFC 中的話,CButton button;button.Create