根据可用功能/工具箱跳过代码行
Skipping lines of code depending on available function(s)/toolboxes
上下文
在工作中,我构建了一个 GUI 来对多个显微镜图像执行图像配准。在我使用(即工作)的计算机上安装了并行处理工具箱,因此我可以利用 spmd 块在计算机核心上分配工作。
首先我创建了一个 codistributed 数组来将我的数组拆分成更小的块:
spmd
DistributedCell = codistributed.cell(NumberFrames)
...
end
一切都很好,直到我 运行 我自己的笔记本电脑上的代码,没有安装 Parallel Processing Toolbox。显然,我不能使用 spmd
块和共分布数组,所以我编写了非并行代码来注册图像,效果同样好,但执行时间更长。
问题
我遇到的问题是 spmd
块中的代码需要在我使用家用笔记本电脑时进行注释,否则 Matlab 会抱怨:
MATLAB cannot determine whether "codistributed"
refers to a function or variable.
所以即使我检查是否安装了PP工具箱,并根据是否安装使用条件执行不同的命令如下:
%// Check for parallel toolbox installed
if ~isempty(ver('parallel'))
NON-PARALLEL code...
else
PARALLEL code...
spmd
PROBLEM HERE
DistributedCell = codistributed.cell(NumberFrames)
...
end
end
Matlab 不会评估 if
语句的条件,并会抛出我上面提到的错误。这非常麻烦,因为每次我在笔记本电脑上使用代码时,我都需要注释所有产生错误的行(其中有很多行),反之亦然。
问题
是否可以避免手动注释代码并使 Matlab 在 运行未安装 PP 工具箱的计算机上运行时不关心共分布数组?
也许我错过了调试世界中一些明显的东西,但我无法绕过它。
如果有用的话,我运行正在Mac上(R2015a 在工作,R2013a 在家里)。
编辑
澄清情况:
错误在任何一行代码执行之前弹出。我想 Matlab 在执行任何代码之前都会解析整个代码,所以我能避免的唯一方法就是对其进行注释。其他函数不会发生这种情况(在这种情况下出现经典的 undefined function [...]
),但我可以使用 if/else
语句避免它。确实是Matlab不喜欢的codistributed
项。
我会走这条路:
>> foo = ver;
>> foo.Name
ans =
MATLAB
ans =
Signal Processing Toolbox
因此,如果您可以分支判断是否在任何 foo(j).Name
中找到字符串 "Parallel"
你需要使用
ver('distcomp')
你的 if
条件,而不是 ver('parallel')
。很混乱,我知道。
如何找到 ver
所需的名称?我知道的最好方法是,如果您查看文件夹 matlabroot\toolbox
(其中 matlabroot
是您的安装文件夹),您会看到许多文件夹,大多数是每个工具箱一个。 ver
所需的名称通常与工具箱文件夹的名称相同 - 在本例中为 distcomp
.
Parallel Computing Toolbox 的早期版本被命名为 Distributed Computing Toolbox,因此文件夹名称尚未更新。
编辑:
您也可能喜欢测试您是否拥有 PCT 的 license,而不是测试它是否已 installed,这就是 ver
测试的内容。
您可以使用 license('test', 'Distrib_Computing_Toolbox')
来做到这一点。
你怎么知道你需要 Distrib_Computing_Toolbox
?这一次,您需要查看您的许可证文件(可能 something.lic
在文件夹 matlabroot\licenses
中,并滚动浏览产品,直到找到相关工具箱的名称。许可证中的产品名称不包含与 ver
.
使用的产品文件夹的关系
这些令人困惑和不同的产品名称让我抓狂,但就是这样。
上下文
在工作中,我构建了一个 GUI 来对多个显微镜图像执行图像配准。在我使用(即工作)的计算机上安装了并行处理工具箱,因此我可以利用 spmd 块在计算机核心上分配工作。
首先我创建了一个 codistributed 数组来将我的数组拆分成更小的块:
spmd
DistributedCell = codistributed.cell(NumberFrames)
...
end
一切都很好,直到我 运行 我自己的笔记本电脑上的代码,没有安装 Parallel Processing Toolbox。显然,我不能使用 spmd
块和共分布数组,所以我编写了非并行代码来注册图像,效果同样好,但执行时间更长。
问题
我遇到的问题是 spmd
块中的代码需要在我使用家用笔记本电脑时进行注释,否则 Matlab 会抱怨:
MATLAB cannot determine whether "codistributed"
refers to a function or variable.
所以即使我检查是否安装了PP工具箱,并根据是否安装使用条件执行不同的命令如下:
%// Check for parallel toolbox installed
if ~isempty(ver('parallel'))
NON-PARALLEL code...
else
PARALLEL code...
spmd
PROBLEM HERE
DistributedCell = codistributed.cell(NumberFrames)
...
end
end
Matlab 不会评估 if
语句的条件,并会抛出我上面提到的错误。这非常麻烦,因为每次我在笔记本电脑上使用代码时,我都需要注释所有产生错误的行(其中有很多行),反之亦然。
问题
是否可以避免手动注释代码并使 Matlab 在 运行未安装 PP 工具箱的计算机上运行时不关心共分布数组?
也许我错过了调试世界中一些明显的东西,但我无法绕过它。
如果有用的话,我运行正在Mac上(R2015a 在工作,R2013a 在家里)。
编辑
澄清情况:
错误在任何一行代码执行之前弹出。我想 Matlab 在执行任何代码之前都会解析整个代码,所以我能避免的唯一方法就是对其进行注释。其他函数不会发生这种情况(在这种情况下出现经典的 undefined function [...]
),但我可以使用 if/else
语句避免它。确实是Matlab不喜欢的codistributed
项。
我会走这条路:
>> foo = ver;
>> foo.Name
ans =
MATLAB
ans =
Signal Processing Toolbox
因此,如果您可以分支判断是否在任何 foo(j).Name
你需要使用
ver('distcomp')
你的 if
条件,而不是 ver('parallel')
。很混乱,我知道。
如何找到 ver
所需的名称?我知道的最好方法是,如果您查看文件夹 matlabroot\toolbox
(其中 matlabroot
是您的安装文件夹),您会看到许多文件夹,大多数是每个工具箱一个。 ver
所需的名称通常与工具箱文件夹的名称相同 - 在本例中为 distcomp
.
Parallel Computing Toolbox 的早期版本被命名为 Distributed Computing Toolbox,因此文件夹名称尚未更新。
编辑:
您也可能喜欢测试您是否拥有 PCT 的 license,而不是测试它是否已 installed,这就是 ver
测试的内容。
您可以使用 license('test', 'Distrib_Computing_Toolbox')
来做到这一点。
你怎么知道你需要 Distrib_Computing_Toolbox
?这一次,您需要查看您的许可证文件(可能 something.lic
在文件夹 matlabroot\licenses
中,并滚动浏览产品,直到找到相关工具箱的名称。许可证中的产品名称不包含与 ver
.
这些令人困惑和不同的产品名称让我抓狂,但就是这样。