我想用matlab函数做两件事。我有一个函数将从一系列文件中获取数据。说我有这个文件结构:
数字1:
我希望函数中的某些选定变量可以全局访问,并在函数完成后保持不变。也就是说我有以下功能:
[] = function(directory)
b = read(directory)
struct c = (do some stuff with b)
somehow globalise c
end
我知道你可以拥有c = function(directory)
然后传递一个变量,但是我不想这样做,我宁愿变量c只是在全局范围内存在。可以这样做吗?
数字2:
matlab函数是否可以使用默认参数。让我们从上面采取功能。我想要做的是将目录default作为当前目录。例如,如果存在以下数据结构:
MatlabMainFolder
-> MatlabFunctions
-> Data
用户应该能够在Data中运行function
并且它将使用Data目录。但是也应该能够从MatlabFunctions直接执行function('../Data')
以获得相同的效果。这可能吗?
答案 0 :(得分:2)
首先:
我认为以下内容应该可以在函数中全局访问变量:
[] = function(directory)
b = read(directory)
global c; <------
struct tmp = (do some stuff with b)
c = tmp; <------
end
然后,在使用之前,在global c
可用的所有其他文件中添加c
。不过,我建议尽可能使用c = function...
。
根据@Ben的建议,assignin
也可用于将变量分配到不同的工作区。这样,从函数中,可以在'base'
工作空间中分配任何变量,该工作空间也可以被所有其他文件访问。在这种情况下:
assignin('base','c',c)
将在基础工作区中创建变量c
,其值与函数文件中的c
相同。 (在函数末尾添加此行)。
第二
你可以这样做:
function(path)
if nargin<1
path = '../Data';
end
% do things with path
end
这样,如果在没有输入的情况下调用function
,则将使用默认路径../Data
,否则将使用作为输入给出的路径。 nargin
将等于作为输入给出的参数数量。
答案 1 :(得分:1)
1)全球和asignin往往不受欢迎。您也可以使用persistent
Pseudocode片段:
function out=fun((directory)
persistent out
if isempty(out)
fill out
return out;
甚至可以处理对象,以防你感觉像现代;)
至2):阅读doc InputParser
- 这比其他许多语言更有用 - 但这是可能的。