4

语境

在工作中,我构建了一个 GUI 来对几个显微图像执行图像配准。在我正在使用(即在工作中)的计算机上安装了并行处理工具箱,因此我可以利用spmd块将工作分配到计算机的核心上。

首先,我创建了一个codistributed数组来将我的数组拆分为更小的块:

spmd

    DistributedCell = codistributed.cell(NumberFrames)
   ...
end

一切都很好,直到我在我自己的笔记本电脑上运行代码,在这台笔记本电脑上没有安装并行处理工具箱。显然我不能使用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这确实是codistributedMatlab 不喜欢的术语。

4

2 回答 2

4

你需要使用

ver('distcomp')

根据你的if情况,不是ver('parallel')。很混乱,我知道。

你怎么知道你需要什么名字ver?我知道的最好方法是,如果您查看文件夹matlabroot\toolboxmatlabroot安装文件夹在哪里),您会看到许多文件夹,每个工具箱大多一个。您需要的名称ver通常与工具箱文件夹的名称相同 - 在本例中为distcomp.

Parallel Computing Toolbox 的早期版本被命名为 Distributed Computing Toolbox,因此文件夹名称尚未更新。

编辑:

您可能还喜欢测试您是否拥有 PCT 的许可证,而不是测试它是否已安装,而这正是ver测试的目的。

您可以使用license('test', 'Distrib_Computing_Toolbox').

你怎么知道它Distrib_Computing_Toolbox是你需要的?这一次,您需要查看您的许可证文件(可能something.lic在 文件夹matlabroot\licenses中,并滚动浏览产品,直到找到相关工具箱的名称。许可证中的产品名称与 . 使用的产品文件夹无关ver

这些令人困惑和不同的产品名称让我抓狂,但你去吧。

于 2015-09-04T17:59:38.910 回答
0

我会这样:

>> foo = ver;

>> foo.Name
ans =
MATLAB
ans =
Signal Processing Toolbox

所以如果你可以分支你是否在任何地方找到字符串“Parallel”foo(j).Name

于 2015-09-04T14:26:48.850 回答