Matlab的导入功能的范围是什么?

时间:2012-10-25 20:04:49

标签: matlab matlab-deployment

我正在尝试将一些用Matlab编写的代码转换为一个独立的,编译好的Matlab应用程序。然而,在得到一些奇怪的错误后,我意识到代码大量使用添加和删除路径来解决这个事实,即有多个函数具有相同的名称(但不同的结果/计算)多次使用。环顾四周,我发现您可以通过在其名称前加上“+”将文件夹转换为包,并通过并确保该包中的函数使用name_of_folder.name_of_function相互引用。这解决了命名空间问题,但它可能会产生很多工作,因为我现在必须经历并为每个函数调用添加正确的包(我可能仍然需要复制大量文件)。

然后我看到了import函数,我希望能节省一些时间。我想我可以将我想要的包传递给一个或两个特定的函数,让这些函数导入包,然后事情将按照我想要的方式工作 - 如果这些函数调用的函数属于该import语句的范围。例如,如果我设置了像

那样的东西
function foo(var1, var2, ..., packagename)
  eval(sprintf('import %s.*', packagename));
  ...
  bar1(var1, var2);
  ...
  bar2(var2);
  ...

然后我希望bar1bar2将使用随import语句导入的包。文档说条件和函数中的import语句仅限于那个代码块,但我不知道“那个代码块”是指仅文本,还是“那个代码块”是代码和评估的所有内容结果是。我觉得这是前者,但我想我会希望它是后者。

那么,import语句的范围是什么?或者,还有另一种方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

对您而言,最好的方法可能是重命名,直到“具有相同名称的多个功能”问题消失为止。它将使您和未来的维护者更容易理解代码。

两个与您的包装理念不同的选项(我喜欢):

  1. 您可以将目录名称附加(或预先添加)到函数名称,并将它们全部放入新的(更好命名的)目录中。根据具体情况,可能会更有意义。

  2. 如果在目录foobar中定义了两个函数car,并且两个函数都使用相同的参数,则可以在单个函数中统一它们{ {1}}或bar作为附加参数:

    car

    这不是很好,但它比修改路径要好得多,而且它遵循MATLAB模式(传入一个字符串参数来改变函数的详细行为)。即使两个function foo(parm1, parm2, parm3, version) if strcmp(version, 'bar') // bar code else // car code end 函数具有不同的参数,您也可以使其工作,但是您必须对参数进行烦人的解析,此时您的包装想法对我来说更容易。

答案 1 :(得分:1)

我写了一些测试代码来为自己试一试,实际上,import语句仅限于调用它的函数,这是有道理的,但我想我的希望使我的判断蒙上阴影。为了记录,我编写了以下简短函数来测试它:

function package_test(package_name)
  eval(sprintf('import %s.*;', package_name));

  test_function();
end

function test_function()
  nested_function()
end

然后把

function nested_function()
  disp('I\'m in the original folder :(');
end

与前两个函数位于同一文件夹中,

function nested_function()
  disp('I\'m in the package! :)');
end

在名为+trial的文件夹中。当然,当我跑package_test('trial')时,我看到“我在原始文件夹中:(”显示在窗口中,而trial.nested_function()给了我希望看到的字符串。

此外,eval函数给编译器带来了问题,用import(sprintf('%s.*', package_name));替换它似乎也没有帮助。所以看起来我回到了复制文件。