有没有办法在Matlab中找到最近评估的变量? who
或whos
似乎没有在工作区中为变量添加时间戳。
这是一个用例。我想有一个泛型函数'probe()',可以在Matlab脚本/代码中的任何地方调用。我想将最近评估的变量保存到.mat文件,而不必传递与保存的变量相关的任何自定义参数。这可能吗?
ans
接近我想要实现的目标,但由于我的代码在分配中的左侧上有变量,因此无法使用。
答案 0 :(得分:1)
如果您在命令提示符中执行此操作,那么您可以执行use this post by gnovice来检索整个命令历史记录,因为您已将MATLAB打开到文本数组。一旦你这样做,你只需在等号前面的倒数第二个行搜索变量....假设你做了一个lhs
语句。您还需要考虑到您在命令提示符中回显变量而没有左侧语句。我们可以通过regexp
轻松找到这一点。
您需要搜索文本数组的倒数第二行,因为gnovice用于捕获历史记录的代码需要额外的代码行。此代码会在历史记录中捕获,而这不是您想要的。因此,您需要查看倒数第二行/条目。
因此,请执行此操作:
history = com.mathworks.mlservices.MLCommandHistoryServices.getSessionHistory; %// From gnovice's post
historyText = char(history);
lne = historyText(end-1,:); %// Get second last line
%// Do a regexp and retrieve the text with or without the equals sign
var = regexp(lne, '\w*', 'match');
%// Get first match which is the variable before any symbols or just the word
var = var{1};
这是一个简单的例子。在尝试上述代码之前,这是我完整的命令历史记录:
>> A = rand(10,10);
>> B = A + 2;
>> D = B * 3;
运行上面的代码后,我得到了var
:
var =
D
同样,如果我们只评估答案而不向左侧分配任何内容:
>> A = rand(10,10);
>> B = A + 3;
>> A
运行上面的代码,我得到:
var =
A
要最终结束这一切,如果要将此变量保存到磁盘,可以使用eval
语句来实现此目的:
>> name_of_file = 'file.mat';
>> eval(['save ' name_of_file ' ' var]);
上面的代码将采用您指定的文件名...所以在这种情况下它将是test.mat
,然后使用var
作为变量从工作区调用save命令喜欢保存。
答案 1 :(得分:1)
这是一个基本的草图,您可以使用函数dbstack
:
function probe
%// get filename of caller file and line where probe was called
lineANDfile = dbstack;
file = lineANDfile(end).file;
linenum = lineANDfile(end).line;
%// read caller m-file
mLines = textread(file, '%s','delimiter', '\n');
%// get line previous of the line where probe was called
mLinesUntilProbeCall = mLines(1:linenum - 1);
%// last non empty line before probe call -> line of interest
mLine = mLines{ find( ~cellfun(@isempty,mLinesUntilProbeCall),1,'last') };
%// get string (variable name) left of =
varnameCell = textscan(mLine,'%s');
%// isolate varnames
getFouts = regexp(varnameCell{1}{1},'(?<=\[).+?(?=\])','match');
if isempty(getFouts)
varnames = varnameCell{1}(1);
else
varnames = strsplit( getFouts{1},',');
end
%// create struct with varnames as fields
for ii= 1:numel(varnames)
probeOut.(varnames{ii}) = evalin('base',varnames{ii});
end
save('probeOut.mat','probeOut');
end
您可以在以下脚本中调用:
y = 5;
xz = 42;
probe %// empty lines before call allowed!
它会创建一个 .mat 文件,其中包含结构probeOut
和字段xz
。
再次加载 .mat 文件后:
>> probeOut.xz
ans =
42
如果您有多个输出参数,它也会起作用:
y = 5;
[xz,z] = deal(42,5);
probe
您的 .mat -file将如下所示:
案例
y = 5;
[xz] = deal(42,5);
probe
也包括在内。