2

我正在编写一系列 MATLAB 函数,它们通过urlread. 此包中进行此调用的每个函数都需要身份验证usernamekey.

我宁愿不要求用户在调用每个函数时传入usernameand 。key相反,我更喜欢有一个signin(username, key)函数来设置/保存这些变量,这样包中的每个函数都可以调用。

我现在的解决方案是signin.m保存username并保存到一个临时文件,并在 MATLAB 关闭时key修改以擦除这个临时文件。finish.m包中的每个函数都会从该临时文件中加载这些变量。但是,如果有人强行退出 MATLAB,这个临时文件将不会被删除(对吗?)。

另一种解决方案是signin保存usernamekey作为全局变量。但是,如果用户调用clear all,这些变量将被删除工作区并且用户将需要signin再次调用(这是一个麻烦)。

有没有办法设置全局的“会话”变量,而不是用clear all命令删除?还有其他建议吗?

4

3 回答 3

5

您可以考虑 MATLAB 的首选项功能。它适用于 setpref、addpref、rmpref 和 getpref 函数。我在一些应用程序中使用了这些工具,它们运行良好。

一个小问题是您是否会经常调用这些工具。由于 getpref 使用从磁盘文件中读取来访问首选项,因此它并没有它可能的那么快。因此,如果由于频繁调用而必须具有绝对最大速度,那么持久变量的混合似乎对我来说效果很好。因此,我有一个用于访问相关首选项的函数。它包含持久变量中的首选项。如果这是第一次查询首选项,则该持久变量将为空,因此我调用 getpref 来填充它。(这是一个很好的功能,因为 pref 将在 MATLAB 会话中持续存在。)当您需要更改变量时,也请执行 setpref。

于 2013-05-30T23:23:40.527 回答
4

您快到了。几个有用的功能:

执着的

首先,您应该使用persistent变量而不是global变量。它们就像全局变量,但仅限于单个函数。他们只是更好。

莫洛克

在函数内运行mlock以防止clearorclear all命令清除与该函数关联的数据。


因此,例如,您可以定义一个快速函数来帮助 Matlab sessionb 中的用户名和密钥,如下所示:

function [name, key] = credentials(varargin)
persistent USERNAME KEY
if nargin==3 && ischar(varargin{1}) && strcmpi(varargin{1},'set')
    USERNAME = varargin{2};
    KEY= varargin{3};
    mlock;
else
    name = USERNAME;
    key = KEY;
end

然后你可以像这样使用它:

%First, set the credentials
credentials set SOMEUSERNAME SOMEKEY

% ....  do some work ....

clear   %As part of your work, clear all variables

% ....  do some more work ....


%Get the credentials later
[name, key] = credentials;
于 2013-05-30T23:00:30.293 回答
0

另一种选择是官方startup.m文件和相关的Startup Folder。这些几乎可以用来做任何事情,包括提供的其他解决方案。

于 2013-05-31T00:09:34.197 回答