1

我有一个带有一组变量(例如var1var2var3var4var5和)var6的工作区。var7有一个 .m 函数(使用包含toassignin('base',...)的默认值。用户将打开 Matlab 并运行此函数,以便将变量及其默认值添加到工作区。之后用户可能会更改某些变量的值甚至删除一些变量。var1var7

现在,如果用户更改了变量值并且他再次运行该函数,我不希望默认值覆盖用户输入的新值。

这是我到目前为止所拥有的:

S = evalin('base','whos');
listWorkspaceVar = {S.name};
compareCellArrayList = ismember(listWorkspaceVar, listParam); % logical vector, listParam is the list of variables in the function assigning the default values, so here listParam would be = {'var1' 'var2' 'var3' 'var4' 'var5' 'var6' 'var7'})
if any(compareCellArrayList) % check if there is at least one declared variable in the base workspace
    tempWorkspaceVarVal = cell(sum(compareCellArrayList),2); % Pre-allocating, 1 column for the variable name and 1 column for the variable value
    jj = 1;
    for ii = 1:size(S,1)
        if compareCellArrayList(1, ii)
            tempWorkspaceVarVal(jj,:) = {listWorkspaceVar{1, ii}, ...
                                         evalin('base',listWorkspaceVar{1, ii})}; 
            jj = jj + 1;
        end
    end
    theDefaultValueFunction() % The function that assignin the default values
    cellfun(@(x,y) assignin('base', x, y), ...
            tempWorkspaceVarVal(:,1), tempWorkspaceVarVal(:,2)) % Overwrite with the temp values in order to keep the new entered values
end

如果我不想更改默认值中的函数分配,我的方法是保留新修改的变量值的最佳方法吗?

4

4 回答 4

2

我认为您不应该为此使用函数,而应使用脚本。脚本在调用者的工作区中运行。因此,如果从命令行调用它,这就是基础工作库。另一个优点是您不需要assignin,这在调试过程中可能会很痛苦。

使用该exist('var1', 'var')命令,您可以检查变量是否var1已经存在,因此不应(重新)初始化。

在元 matlab 代码中:

if ~exist('var1', 'var')
    % var1 does not exist
    var1 = zeros(10, 5);
end
于 2013-08-30T13:25:42.000 回答
1

如果您对向 DefaultValueFunction() 添加至少几行代码感到很酷,那么这是一个疯狂的解决方案,您可以尝试:

function theDefaultValueFunction()

persistent hasRunOnce  % creates a empty matrix
if isempty(hasRunOnce) % Check if the function has already run
    % Your function code here
end
hasRunOnce = true;

第一次运行该函数后,设置了 hasRunOnce 变量,该函数不再更改工作区变量。持久变量在函数内部具有局部作用域,但它们像全局变量一样存储在内存中。

要清除持久变量,您必须清除函数:

clear theDefaultValueFunction
于 2013-08-30T15:31:39.593 回答
0

如果您想要一个函数(不返回)并从基本工作空间获取值并编辑它们,您可能需要全局变量

但是,请仔细考虑您是否需要这个。考虑让函数简单地返回变量,或将它们保存到文件中。通常不建议使用全局变量,但我更喜欢它们而不是您当前的方法。

于 2013-08-30T13:27:27.737 回答
0

这绝对不是最好的方法。但猜想这很简单,会为您节省大量时间。

function theDefaultValueFunction()

save('workspace.mat') % save all of the workspace, save it in a place with write permissions

% your code here

load('workspace.mat') % updates the variables into their old values (i.e user changed values), 
                      % any new variables (recreated by the function) remain unaffected

delete workspace.mat
于 2013-08-30T19:04:05.963 回答