MATLAB中的数据光标保持空白

时间:2014-08-26 17:59:13

标签: matlab matlab-figure

我对MATLAB有一个奇怪的问题,当我绘制一个曲面时,我使用数据光标,在光标点上悬停的小方框中没有数字出现。我在下面附上了一张照片,以帮助理解:

[数据光标未显示任何坐标](http://imgur.com/qeckKZx)(

我已经检查了stackoverflow上的许多其他链接,包括: Erratic Data CursorsGetting Data Cursor CoordinatesGetting Coordinates of Clicked Points但是,他们似乎没有回答我的问题(据我所知)。

为了清楚我正在做什么,我使用MIT Photonic Bands进行了一些模拟,将表面导入MATLAB,对其进行了一些计算并绘制了它。下面是我所做的剧本:

function [Kx,Ky,S] = BandSurface(k_1,k_2,B,b,z,p,varargin)

%Outputs:   Kx - The k_x "matrix" (from meshgrid) used to plot a surface
%           Ky - The k_y "matrix" used to plot a surface            
%           S - The band surface
%Inputs:    k_1 - the x-component of the k-point at which the band is
%                 calculated.
%           k_2 - the y-component.
%           B - the matrix holding all the bands, obtained from ReadBands.
%           b - indicated which band for which we want the surface.
%           z - whether (z=1) or not (z~=1) we want the band surface to be
%               (artificially) centered at (k_x,k_y)=(0,0).
%           p - Whether we want to plot (p=1) or not (p~=1)
%Optional Inputs:
%           m - If the G-X-M-Y-G quarter of the FBZ is spanned by vectors
%               k_x and k_y, m is the integer that indexes the point k_x(m)
%               at which we want to re-center the band surface.
%           n - The integer that indexes k_y(n) at which we want to
%               recenter the band surface.


%Check that the number of optional arguments does not exceed two.
nVarargin = length(varargin);
if nVarargin > 0 && nVarargin < 2
    error('Not enough optional input arguments!');
elseif nVarargin > 2
    error('Too many optional input arguments!');
end

%First thing we need to do is make a meshgrid of k_1 and k_2.  Get the
%unique values from k_1 and k_2.  This defines a quarter of the first BZ.
k_x = unique(k_1);
k_y = unique(k_2);

%Define the lengths of the unique vectors
nx = length(k_x);
ny = length(k_y);

%Now, we know how the band is set up.  We got the band structure for a
%quarter of the first BZ, between k_1={0, dkx, 2*dkx, ..., 0.5-dkx, 0.5} and
%analagous for k_2.
BS = zeros(nx,ny);

%Define the surface over the grid.
for i=1:nx
    for j=1:ny
        BS(i,j) = B((j-1)*ny+i,b);
    end
 end

%Now, make this over the entire first BZ.
gvx = linspace(-1*max(k_x),max(k_x),2*nx-1);
gvy = linspace(-1*max(k_y),max(k_y),2*ny-1);
[Kx,Ky] = meshgrid(gvx,gvy);

%Do the band surface
S = zeros(2*nx-1,2*ny-1);
for i=1:nx
    for j=1:ny
        S(nx-i+1,ny-j+1)=BS(i,j);
        S(nx-i+1,j+ny-1)=BS(i,j);
        S(i+nx-1,ny-j+1)=BS(i,j);
        S(i+nx-1,j+ny-1)=BS(i,j);
    end
end

%Define the k-point at which we want to center the distribution.
if nVarargin ~= 0
    m = varargin{1};
    n = varargin{2};

    %Try a different approach.  Let SS be the matrix which holds the
    %"four-folded" S matrix.

    %Let S1 be S.
    S1 = S;

    %Flip S1 to the left.
    S2 = fliplr(S1);

    %Concatenate everything except the last column of S2 to S1.
    SU = horzcat(S2(:,1:1:size(S2,2)-1),S1);

    %Flip S1 down.
    S4 = flipud(S1);

    %Flip S1 down and to the left
    S3 = fliplr(flipud(S1));

    %Concatenate everything except the last column of S3 to S4.
    SD = horzcat(S3(:,1:1:size(S3,2)-1),S4);

    %Now vertically concatenate SU and SD, except the first row of SD.
    SS = vertcat(SU,SD(2:1:size(SD,1),:));

    %Now, seeing Aug 25, 2014 notes, we find out the point in S1 (in the 3rd
    %quadrant of S1) where we want to center the band surface.  Then we find
    %out where this point lies in SS.  Then, take a subset of SS centered about
    %this point.
    S = SS(nx-1+m:1:3*nx-3+m,ny-1+n:1:3*ny-3+n);

    %Define a grid spacing.
    dkx = (k_x(length(k_x)) - k_x(1))/(nx-1);
    dky = (k_y(length(k_y)) - k_y(1))/(ny-1);

    %Now, redefine our grid vectors.
    gvx = linspace(k_x(m)-nx*dkx,k_x(m)+nx*dkx,2*nx-1);
    gvy = linspace(k_y(n)-ny*dky,k_y(n)+ny*dky,2*ny-1);
    [Kx,Ky] = meshgrid(gvx,gvy);
end

%Now, center the band surface at zero if we are asked to.
if z==1
    gvx = linspace(-nx*dkx,nx*dkx,2*nx-1);
    gvy = linspace(-ny*dky,ny*dky,2*ny-1);
    [Kx,Ky] = meshgrid(gvx,gvy);
end


%Plot it.
if p ==1
    figure();
    clf;
    surf(Kx,Ky,S);
    xlabel('k_x (2 \pi /a)');
    ylabel('k_y (2 \pi /a)');
end
end

(我知道很多其他人可能都没有意义,但为了完整起见,我已将整个功能包括在内。)我不认为我做过任何与众不同的事情。绘图(见我附加代码的底部)所以我不知道为什么会这样。

另外,值得一提的是,昨天当我调试这个函数时,我正在使用调试器。数据游标工作正常。然后,由于某种原因,它吐出关于打印模板的警告。在这个警告之后,我认为重新启动MATLAB可以解决问题,但事实并非如此,并且由于自那个问题以来发生了其他警告,lastwarn没有返回警告,我似乎无法恢复关于打印的警告我提到的模板。

另外,应该注意的是,虽然数据光标在这台机器上不起作用,但当我去另一台机器时,它似乎工作正常。

如果有人能帮我弄明白为什么会这样,我会非常感激!

编辑:在下面的评论中,patrik询问是否每次都发生这种情况。为了说明这一点,我在Z = 3 * X. ^ 2 + Y ^ 2的X = [ - 3,3]和Y = [ - 4,4]范围内制作了一个简单的parabloid。如果我使用小网格大小,如下所示:

[X,Y]=meshgrid(-3:0.5:3,-4:0.5:4)
Z = 3*X.^2+Y.^2;
figure();
surf(X,Y,Z);

我得到以下figure,确实数据光标似乎工作正常!

但是,如果我使用更精细的网格来完全相同的parabloid如下:

[X,Y]=meshgrid(-3:0.05:3,-4:0.05:4);
Z = 3*X.^2+Y.^2;
figure();
surf(X,Y,Z);

我得到另一个数字(我不允许链接到,因为我的声誉不够高,但链接是http://imgur.com/EWJv041),其中数据光标不起作用!

所以,为了回答你的问题,它不会一直发生,但它似乎发生在某个网格分辨率之后。

2 个答案:

答案 0 :(得分:2)

我遇到了与上述相同的问题。我还使用提供的代码测试了行为。 我在带有可切换图形卡(Intel HD和AMD Radeon)的笔记本电脑上运行Matlab。

解决方案:

Matlab已准备好与AMD处理器一起运行。 将其切换为使用集成的Intel HD运行后,它再次工作!通过&#34;省电&#34;选择集成的Intel卡。选项。

示例链接:http://i62.tinypic.com/vfaxw3.jpg 没有发布图片的声誉。

可以从AMD Cataclyst控制中心切换显卡。如果问题出现在Nvidia卡上,您可以在Nvidia控制面板中更改它

答案 1 :(得分:0)

以下是关于如何调试它的建议,因为我无法在本地重现您的问题。

  1. 尝试在\<MATLAB Folder>\R201??\toolbox\matlab\graphics\@graphics\@datatip\datatip.m之上设置一个断点,然后按照工作示例和非工作示例进行操作,并查看是否以及何时出现差异。

    < / LI>
  2. 尝试将图形保存为.fig并将其上传到某处。如果图形的某些设置(或默认设置)不好,则可以将其与在不同计算机上创建的工作图形进行比较,并查看差异的位置。 Here's a working figure我为你的最后一个例子做了,包括一个数据提示。如果这个图适合你,我可以建议一个解决方法,你只需在另一台计算机上创建一个空的(和功能)图形文件(或使用我上传的那个),然后只使用你自己的数据轴。

  3. 尝试backing up and then deleting您的偏好设置文件夹。您可能有一些损坏的设置。 (一个不太可能但可能的原因是字体\解释器问题......看起来你的字体与我的字体略有不同,效果很好,所以重置首选项可能对此有帮助。)

  4. 如果其中任何一项对你有用,请告诉我。