❶ 如何创建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