这不是一个问题,因为我有答案,但由于我找不到相关的来源,我会在这里发布问题以及答案,以防你感兴趣.(如果我忘记了我是怎么做的,也能够再次找到它).
我在查看一些代码时遇到了一个问题.代码中没有解释大量的变量,每次我想知道变量的含义我必须在数据文件中查看和/或从代码中完成的操作中猜出它们的含义.
没必要说这是非常耗时的,我搜索了减少时间的最佳方法.
首先,我将关于变量的所有解释放在注释中,问题是它在脚本中添加了一个(巨大的!)行.
我还在MATLAB中使用"在编辑模式下启用数据提示".当您将鼠标悬停在已经评估过的MATLAB变量名称上时,它会根据所有维度和至少其第一个值给出它的大小,这样就可以更容易地了解您正在操作的对象.(见下图)
我想到的自然想法如下:是否有可能让MATLAB在数据提示中显示更多自定义信息?
答案是肯定的!
请参阅答案中的代码
Bil*_*eey 10
我们需要进行一些预处理才能使其正常工作,即:
1)创建一个数据文件,将变量名称链接到它们的描述(这是无聊的部分,虽然我已经不得不这样做才能理解代码.只要在遇到新变量时添加一行)
我选择将这些数据保存在CSV文件中,其中第一列包含变量名称,第二列包含描述,例如
2)编辑MATLAB的功能datatipinfo
(可以通过输入edit datatipinfo
MATLAB的命令窗口访问它的内部代码)
该datatipinfo
功能如下:
function datatipinfo(val)
% Some error checking / Initialization
function prefix=sizeType %#ok<DEFNU> All uses are in EVALC calls.
s = size(val);
D = numel(s);
if D == 2
theSize = [num2str(s(1)), 'x', num2str(s(2))];
elseif D == 3
theSize = [num2str(s(1)), 'x', num2str(s(2)), 'x', ...
num2str(s(3))];
else
theSize = [num2str(D) '-D'];
end
if isempty(val) == 0
prefix = [name ': ' theSize ' ' class(val)];
else
prefix = [name ': empty ' theSize ' ' class(val)];
end
end
% Some other stuff
end
Run Code Online (Sandbox Code Playgroud)
这prefix
是我们为了做我们想做的事情而编辑的功能,以及初始化阶段的一些文件扫描和字符串比较:
A)初始化阶段:
% Read data from csv file :
fid = fopen('ToyVars.csv');
Data = textscan(fid, '%s%s','whitespace','','delimiter',';');
fclose(fid);
Run Code Online (Sandbox Code Playgroud)
B)将您正在悬停的变量的名称与Data中的变量名称进行比较
NameFound=0;
% Get Variable Names and Corresponding comments
TmpNames=Data{1,1};
TmpComments=Data{1,2};
% Loop through TmpNames. If a Name matches, assign corresponding comment to the variable Comment
for ii=1:size(TmpNames,1)
if(isequal(char(TmpNames(ii))),name)
Comment=char(TmpComments(ii));
NameFound=1;
end
end
Run Code Online (Sandbox Code Playgroud)
C)在datatip if中添加注释 NameFound==1
if NameFound
if isempty(val) == 0
prefix = [name ': ' theSize ' ' class(val) ' : ' Comment];
else
prefix = [name ': empty ' theSize ' ' class(val) ' : ' Comment];
end
else
if isempty(val) == 0
prefix = [name ': ' theSize ' ' class(val)];
else
prefix = [name ': empty ' theSize ' ' class(val) ];
end
end
Run Code Online (Sandbox Code Playgroud)
瞧!
通过稍微调整和对调用函数的一些修改,您还可以使用@BillBokeey的答案,而无需任何外部依赖.通过将结构数组放在与预览变量相同的工作空间中,可以将字符串存储在与变量同名的字段中,并利用evalin
现有逻辑datatipinfo
输入@ BillBokeey的修改输入.
对于我的测试用例,我将我的字符串存储在一个名为的结构中mydatastrings
:
mydatastrings.test = 'Test Variable';
Run Code Online (Sandbox Code Playgroud)
在datatipinfo
我的身体中添加了一个try
块:
NameFound = 0;
try
Comment = evalin('caller', sprintf('mydatastrings.%s', name));
NameFound = 1;
end
Run Code Online (Sandbox Code Playgroud)
随着@BillBokey对嵌套prefix
函数的修改:
if NameFound
if isempty(val) == 0
prefix = [name ': ' theSize ' ' class(val) ' : ' Comment];
else
prefix = [name ': empty ' theSize ' ' class(val) ' : ' Comment];
end
else
if isempty(val) == 0
prefix = [name ': ' theSize ' ' class(val)];
else
prefix = [name ': empty ' theSize ' ' class(val) ];
end
end
Run Code Online (Sandbox Code Playgroud)
我们也取得了同样的成果.
完整文件在此Gist中
编辑:
您还可以进行最小调整datatipinfo
以显示注释而无需修改prefix
.似乎任何执行都会datatipinfo
捕获命令窗口的所有输出,并在弹出窗口而不是命令窗口本身中显示它们.
如果我们try
简单地替换上一个块:
try
Comment = evalin('caller', sprintf('mydatastrings.%s', name))
end
Run Code Online (Sandbox Code Playgroud)
并保留prefix
默认的MATLAB安装,我们获得以下弹出窗口:
这也包含在Gist中 datatipinfo_noprefix.m