这不是一个问题,因为我有答案,但由于我找不到相关的来源,我会在这里发布问题以及答案,以防你感兴趣.(如果我忘记了我是怎么做的,也能够再次找到它).
我在查看一些代码时遇到了一个问题.代码中没有解释大量的变量,每次我想知道变量的含义我必须在数据文件中查看和/或从代码中完成的操作中猜出它们的含义.
没必要说这是非常耗时的,我搜索了减少时间的最佳方法.
首先,我将关于变量的所有解释放在注释中,问题是它在脚本中添加了一个(巨大的!)行.
我还在MATLAB中使用"在编辑模式下启用数据提示".当您将鼠标悬停在已经评估过的MATLAB变量名称上时,它会根据所有维度和至少其第一个值给出它的大小,这样就可以更容易地了解您正在操作的对象.(见下图)
我想到的自然想法如下:是否有可能让MATLAB在数据提示中显示更多自定义信息?
答案是肯定的!
请参阅答案中的代码
Bil*_*eey 10
我们需要进行一些预处理才能使其正常工作,即:
1)创建一个数据文件,将变量名称链接到它们的描述(这是无聊的部分,虽然我已经不得不这样做才能理解代码.只要在遇到新变量时添加一行)
我选择将这些数据保存在CSV文件中,其中第一列包含变量名称,第二列包含描述,例如
2)编辑MATLAB的功能datatipinfo(可以通过输入edit datatipinfoMATLAB的命令窗口访问它的内部代码)
该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)将您正在悬停的变量的名称与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
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
瞧!
通过稍微调整和对调用函数的一些修改,您还可以使用@BillBokeey的答案,而无需任何外部依赖.通过将结构数组放在与预览变量相同的工作空间中,可以将字符串存储在与变量同名的字段中,并利用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
我们也取得了同样的成果.
完整文件在此Gist中
编辑:
您还可以进行最小调整datatipinfo以显示注释而无需修改prefix.似乎任何执行都会datatipinfo捕获命令窗口的所有输出,并在弹出窗口而不是命令窗口本身中显示它们.
如果我们try简单地替换上一个块:
try
    Comment = evalin('caller', sprintf('mydatastrings.%s', name))
end
并保留prefix默认的MATLAB安装,我们获得以下弹出窗口:
这也包含在Gist中 datatipinfo_noprefix.m
| 归档时间: | 
 | 
| 查看次数: | 188 次 | 
| 最近记录: |