代码组织Matlab

时间:2016-07-11 12:40:13

标签: performance matlab function

我在Matlab写了一些程序。我在 .m 文件中执行此操作。现在它有300多个代码串,因此阅读起来不太舒服。我的想法是像在C ++中一样使用它:我想在这个文件的末尾创建本地函数并将代码片段放入其中。它很容易阅读,它将由一些逻辑部分组成。

但是我面对的事实是只能在其他功能的主体中创建本地功能!所以我不能创造这个:

x = 1;
y = 2;
z = myLocalFnc(x,y);

function res = myLocalFnc (a,b)
 res = a.*b;
end

这会产生错误:

  

在此上下文中不允许使用函数定义。

我可以通过将整个代码包含在一个函数中来实现:

function myBigFcn
x = 1;
y = 2;
z = myLocalFnc(x,y);
end

function res = myLocalFnc (a,b)
 res = a.*b;
end

但是现在所有的变量都变成了本地变量而且它没有返回工作区。 每当我创建一些变量时,修改此函数的输入/输出 - 我不认为我走得正确... Here描述了这种方法的优点和缺点。

我知道我可以在额外的.m文件中创建函数,保存并在我的脚本中使用 - 好的,但是很多都是单操作,我不想创建这么多新文件。

我的问题是还有其他任何代码组织方法吗?

2 个答案:

答案 0 :(得分:2)

如果你真的希望你的主要内容是一个脚本(我不推荐这个),你可以将所有其他功能放在单独的.m文件中,并从脚本中调用它们。

正如您所指出的,另一个选项是将“main”部分的全部内容放入代码顶部的函数中。您可以通过输出参数返回所有必需的值,或者如果以后需要访问它们,请将它们保存到.mat文件中。

作为旁注,the ability to put local functions within a script (what you're trying to do) is present in R2016b which will be released later this Fall

<强>更新

如果您想要一种简单的方法将代码转换为函数。您可以在函数末尾自动将所有变量轻松保存到结构中,并返回此结构。

function output = my_script_that_is_now_a_function(inputs)

    % Do stuff

    % Now save all variables in a struct and return it
    tmpfile = tempname;
    save(tmpfile);
    output = load(tmpfile);
    delete(tmpfile);
end

答案 1 :(得分:1)

如果您不介意在本地保存文件,一个选项是将代码重组为多个函数(全部在同一文件中),并将必要的变量作为输出传递。然后你有一个简短的脚本调用这个函数并创建必要的变量。

例如,假设您的脚本看起来像这样

numPoints = 5;
a = randn(numPoints);
b = sin(a);
c = a + b;

您可以将其重组为

function data = main()
  data.numPoints = 5;
  data.a = getA(data.numPoints);
  data.b = getB(data.a);
  data.c = getC(data.a, data.b);

function a = getA(numPoints)
  a = randn(numPoints);

function b = getB(a)
  b = sin(a);

function c = getC(a, b)
  c = a + b;

并创建一个类似于

的脚本文件
data = main();

然后你有一个名为data的结构,它包含你所有的变量。如果你真的希望它们包含在单独的变量中(即不在结构中),那么有几种方法可以做到。一种是手动解压缩,

a = data.a;
b = data.b;
c = data.c;

clear data;

另一种方法是保存结构,然后重新加载它(这样做的好处是保留用于此功能的工作区的副本,供以后分析)。

save('workspace.mat', '-struct', 'data');
load('workspace.mat');