这不是一个问题,因为我有答案,但由于我找不到相关的来源,我会在这里发布问题和答案,以防你感兴趣。 (如果我忘记了我是怎么做的,也能够再找到它。)
我在查看一些代码时遇到了一个问题。代码中没有解释大量的变量,每次我想知道变量的含义我必须在数据文件中查看和/或从代码中完成的操作中猜出它们的含义。
无需说这非常费时,而且我搜索了减少时间的最佳方法。
首先,我将关于变量的所有解释都放在注释中,问题是它在脚本中添加了一个(巨大的!)很多行。
我也在MATLAB中使用“在编辑模式下启用数据提示”。当您将鼠标悬停在已经评估过的MATLAB变量名称上时,它会根据所有维度和至少其第一个值给出它的大小,这样就可以更容易地了解您正在操作的对象。 (见下图)
我想到的自然想法如下:是否有可能让MATLAB在数据提示中显示更多自定义信息?
答案是肯定的!
参见答案中的代码
答案 0 :(得分:10)
为了实现这一点,我们需要进行一些预处理,即:
1)创建一个将变量名称链接到其描述的数据文件 (这是无聊的部分,虽然我已经不得不这样做才能理解代码。每次遇到新变量时只需添加一行)
我选择将这些数据保存在CSV文件中,其中第一列包含变量名称,第二列包含描述,例如
2)编辑MATLAB的函数datatipinfo
(可以通过在MATLAB的命令窗口中键入edit datatipinfo
来访问它的内部代码)
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
我们将编辑prefix
函数以执行我们想要执行的操作,以及初始化阶段中的一些文件扫描和字符串比较:
A)初始化阶段:
% Read data from csv file :
fid = fopen('ToyVars.csv');
Data = textscan(fid, '%s%s','whitespace','','delimiter',';');
fclose(fid);
B)将您悬停的变量名称与数据中的变量名称进行比较
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
C)如果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
瞧!
答案 1 :(得分:5)
通过稍微调整和对调用函数的一些修改,您还可以使用@BillBokeey's answer而无需任何外部依赖项。通过将结构数组放在与预览变量相同的工作空间中,可以将字符串存储在与变量同名的字段中,并将evalin
与datatipinfo
中的现有逻辑一起使用@ BillBokeey修改的输入。
对于我的测试用例,我将我的字符串存储在名为mydatastrings
的结构中:
mydatastrings.test = 'Test Variable';
在datatipinfo
的正文中,我添加了try
块:
NameFound = 0;
try
Comment = evalin('caller', sprintf('mydatastrings.%s', name));
NameFound = 1;
end
随着@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
我们也取得了相同的成果。
完整档案位于this Gist
编辑:
您还可以对datatipinfo
进行微调,以便在不修改prefix
的情况下显示评论。似乎任何执行datatipinfo
都会捕获命令窗口的所有输出,并将其显示在弹出窗口而不是命令窗口本身。
如果我们只用以下内容替换以前的try
块:
try
Comment = evalin('caller', sprintf('mydatastrings.%s', name))
end
并保留prefix
,因为它在默认的MATLAB安装中,我们获得以下弹出窗口:
这也包含在Gist中datatipinfo_noprefix.m
答案 2 :(得分:2)
另一种方法是将Matlab已定义的类(如double
)子类化,并添加字符串属性。该字符串将出现在数据提示上。
如何使用其他属性进行子类化: http://fr.mathworks.com/help/matlab/matlab_oop/built-in-subclasses-with-properties.html