2016-07-11 295 views
0

我在Matlab上编写了一些程序。我在.m文件中做。现在它有300多个代码串,所以阅读起来不太舒服。我的想法是像在C++中一样使用它:我想在这个文件的末尾创建本地函数,并将代码放入其中。这将很容易阅读,它会包含一些逻辑部分。代码组织Matlab

但是我面临的事实是本地函数只能在其他函数体中创建!所以我不能创造这样的:

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

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

此产生错误:

Function definitions are not permitted in this context.

我可以包括整个代码转换成一个功能做到这一点:

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

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

但现在所有的变量变成本地变量,并且它不返回工作区。 修改此功能的输入/输出任何时候我创建一些变量 - 我不认为我走正确的方式... Here描述了这种方法的优点和缺点。

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

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

+0

@excaza我想我*唯一的原因是因为我们现在在2016b有一个* actual *解决方案,应该注意。 – Suever

+0

@Suever所以添加它作为答案的愚蠢。没有理由在第一时间回答这个问题...... – excaza

回答

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

我喜欢使用脚本将所有其他代码放入另一个函数的想法。谢谢 –

2

如果你真的想让你的主要东西成为一个脚本(我不建议这样做),你可以将所有其他功能放在单独的.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 
+0

感谢您的快速响应!你可以添加信息为什么你建议避免使用脚本?还有什么更好使用 - .m文件功能? –

+1

@Mikhail_Sam依赖脚本将所有变量保存到全局工作空间通常是一个糟糕的主意。如果你保存一个变量'M'并且你已经有一个变量'M',那该怎么办?你应该使用函数并显式返回你需要的变量,并允许用户指定在哪里存储这些变量 – Suever

+0

我明白了。看起来像R2016b是我想要的。 我也理解使用脚本的缺点,但我喜欢收缩我的代码的阶段 - 因为我通常检查很多临时变量,所以将它们全部添加到函数输出 - 这是很多例程... –