我有什么:
我有一个名为myscript.m
的matlab脚本,该脚本使用p编码辅助函数fcn_A.p
和fcn_B.p
(我编写并拥有源代码)。
我想要的是什么:
我希望将这些作为一个单元分发给其他人,以便:
>> myscript
>> myscript
运行一个脚本 - 而不是一个函数。即它定义的变量是在matlab基础环境中设置的我也希望尽量避免保护myscript
。这样,它就可以作为如何使用fcn_A
和fcn_B
的示例。
编辑:最理想的情况是,我喜欢您只是移动到路径或工作目录中的文件或文件夹,然后一切正常,甚至无需更改路径。
我尝试了什么:
将所有内容放入同一个脚本文件中并不符合第二个要求。
使它成为一个类(通过classdef
文件或@myscript
目录)并不符合第三个要求。
使其成为一个包(使用+myscript
目录)并不符合第一个要求。
我相信我需要
我相信如果有办法定义一个默认的'包的功能。有点像键入+mypackage/Contents.m
时显示help mypackage
的内容。
有办法做到这一点吗?
答案 0 :(得分:1)
将包含函数和脚本的文件夹添加到MATLAB路径中。满足所有4个条件。
答案 1 :(得分:1)
我(和mathworks)的方式通常会这样做:
现在你只有1个文件可供分发,甚至包括文档
请注意,这实际上是matlab本身所做的。请参阅此链接,例如:
答案 2 :(得分:1)
事实证明,我的所有要求实际上都可以通过使用assignin
来完成。
我的解决方案如下:
<强>文件:强>
@myscript
@myscript/myscript.m
@myscript/fcn_A.p
@myscript/fnc_B.p
<强> @的MyScript / myscript.m 强>
classdef myscript
methods (Static)
fcn_A
fcn_B
end
methods
function self = myscript()
% Using a variable defined in the calling environment (if defined)
outside_variable = evalin('caller', 'outside_variable', NaN);
if isnan(outside_variable)
outside_variable = 'default value';
end
... code goes here ...
outside_variable = self.fcn_A(parameters, outside_variable);
% Putting the variable back in the calling environment (even if not defined before)
assignin('caller', 'outside_variable', outside_variable);
end
end
end
现在:
>> myscript
将运行类构造函数并返回一个
空类对象,我可以忽略它。myscript.fcn_A
和myscript.fcn_B
可以被调用,因为它们是静态类函数。variable_to_save
将按预期在基本环境中设置。@myscript
目录移动到新计算机的路径中足以使其正常工作。但仍存在一个问题。
如果fcn_A
或fcn_B
是一个类,这将不起作用,因为MATLAB不允许堆栈类。坏消息!我在这个问题中没有提到这一点,因为我无法想象它会有所作为......