根据可用的功能/工具箱跳过代码行

时间:2015-09-04 13:26:04

标签: matlab debugging parallel-processing spmd

上下文

在工作中,我构建了一个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术语。

2 个答案:

答案 0 :(得分:4)

您需要使用

if

表示ver('parallel')条件,而不是ver。我知道,很困惑。

如何找出matlabroot\toolbox所需的名称?我知道的最佳方式是,如果您查看文件夹matlabroot(其中ver是您的安装文件夹),您将看到许多文件夹,大多数是每个工具箱一个。 distcomp所需的名称通常与工具箱文件夹的名称相同 - 在这种情况下,它是ver

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

编辑:

您也可以,或者更喜欢测试您是否拥有PCT的许可,而不是测试它是否已安装,这就是{ {1}}测试。

您可以使用license('test', 'Distrib_Computing_Toolbox')执行此操作。

您如何知道自己需要的Distrib_Computing_Toolbox?这一次,您需要查看许可证文件(可能是something.lic文件夹中的matlabroot\licenses,然后滚动浏览产品,直至找到相关工具箱的名称。许可证中的产品名称为no与ver使用的产品文件夹的关系。

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

答案 1 :(得分:0)

我会这样:

>> foo = ver;

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

因此,如果你能找到字符串" Parallel"在任何foo(j).Name