工作会话变量-MATLAB

工作会话变量-MATLAB,matlab,Matlab,我正在编写一系列MATLAB函数,这些函数通过urlread与服务器通信。此包中进行此调用的每个函数都需要身份验证用户名和密钥 我不希望在调用每个函数时要求用户传入用户名和键。相反,我更喜欢使用sign(username,key)函数来设置/保存这些变量,这样包中的每个函数都可以调用 我现在的解决方案是signin.m将username和key保存到一个临时文件中,并在MATLAB关闭时修改finish.m以删除此临时文件。包中的每个函数都将从该临时文件加载这些变量。但是,如果有人强制退出MAT

我正在编写一系列MATLAB函数,这些函数通过
urlread
与服务器通信。此包中进行此调用的每个函数都需要身份验证
用户名
密钥

我不希望在调用每个函数时要求用户传入
用户名
。相反,我更喜欢使用
sign(username,key)
函数来设置/保存这些变量,这样包中的每个函数都可以调用

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

另一个解决方案是将
登录
保存
用户名
作为全局变量。但是,如果用户调用
清除所有
,这些变量将从工作区中删除,用户将需要再次调用
登录
(这是一个麻烦)


是否有某种方法可以设置全局的“会话”变量,并且不使用
清除所有
命令删除这些变量?还有其他建议吗?

你就快到了。一些有用的功能:

持久性

首先,您应该使用
持久
变量,而不是
全局
变量。它们类似于全局函数,但只限于单个函数。他们只是更好

mlock

在函数内运行
mlock
,以防止
clear
clear all
命令清除与该函数相关的数据


例如,您可以定义一个快速函数来帮助Matlab会话B中的用户名和键,如下所示:

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;

<>你可以考虑Matlab的偏好特性。它与函数setpref、addpref、rmpref和getpref一起工作。我在一些应用程序中使用了这些工具,它们工作得很好


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

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

酷,我不知道这一点。会话结束/开始时是否可以自动重置首选项?您可以将任何需要的内容放入startup.m,因此,是的,您可以在那里执行任何需要的操作。就这点而言,还有一个finish.m,当MATLAB退出时会自动调用。(我从未使用过,但支持finish.m。)或者,如果您使用我提出的范例,即一个包含也使用pref的持久变量的函数,那么在会话开始时第一次调用该工具时,只需将pref设置为默认值即可。