【问题标题】:Code organization Matlab [duplicate]代码组织Matlab [重复]
【发布时间】:2016-11-13 09:58:02
【问题描述】:

我在 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 文件中创建函数,将其保存并在我的脚本中使用 - 好的,但其中很多都是单操作,我不想创建这么多新文件。

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

【问题讨论】:

  • @excaza 我想我 not 标记为骗子的唯一原因是我们现在在 2016b 有一个 actual 解决方案,应该注意这一点.
  • @Suever 所以将它添加为欺骗的答案。首先没有理由回答这个问题......

标签: performance matlab function


【解决方案1】:

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

正如您所指出的,另一种选择是将“主要”部分的全部内容放入代码顶部的函数中。您可以通过输出参数返回所有必要的值,或者如果您以后需要访问它们,可以将它们保存到 .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

【讨论】:

  • 感谢您这么快的回复!您能否添加您为什么建议避免使用脚本的信息?还有什么更好的替代方法 - .m 文件功能?
  • @Mikhail_Sam 依靠脚本将所有变量保存到全局工作区通常是个坏主意。如果你保存一个变量 M 并且你已经有一个变量 M 怎么办?您应该使用函数并显式返回您需要的变量,并允许用户指定存储这些变量的位置
  • 我明白了。看起来 R2016b 是我想要的。我也了解使用脚本的缺点,但我喜欢在代码压缩阶段使用它——因为我通常会检查很多临时变量,所以将它们全部添加到函数输出中——这是很多例程......跨度>
  • @Mikhail_Sam R2016b 直到秋季才会对公众开放。为什么不将所有变量保存到函数底部的结构中。我将在文章末尾添加一个示例。
  • @hbaderts 不,我根本不推荐它。正确的解决方案是重构代码。
【解决方案2】:

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

例如,假设您的脚本如下所示

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');

【讨论】:

  • 我喜欢使用脚本将所有其他代码放到另一个函数中的想法。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 2011-08-08
  • 2011-06-04
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
相关资源
最近更新 更多