我对MATLAB有一个奇怪的问题,当我绘制一个曲面时,我使用数据光标,在光标点上悬停的小方框中没有数字出现。我在下面附上了一张照片,以帮助理解:
[数据光标未显示任何坐标]()(
我已经检查了stackoverflow上的许多其他链接,包括: Erratic Data Cursors,Getting Data Cursor Coordinates,Getting 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
),其中数据光标不起作用!
所以,为了回答你的问题,它不会一直发生,但它似乎发生在某个网格分辨率之后。
答案 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)
以下是关于如何调试它的建议,因为我无法在本地重现您的问题。
尝试在\<MATLAB Folder>\R201??\toolbox\matlab\graphics\@graphics\@datatip\datatip.m
之上设置一个断点,然后按照工作示例和非工作示例进行操作,并查看是否以及何时出现差异。
尝试将图形保存为.fig
并将其上传到某处。如果图形的某些设置(或默认设置)不好,则可以将其与在不同计算机上创建的工作图形进行比较,并查看差异的位置。 Here's a working figure我为你的最后一个例子做了,包括一个数据提示。如果这个图适合你,我可以建议一个解决方法,你只需在另一台计算机上创建一个空的(和功能)图形文件(或使用我上传的那个),然后只使用你自己的数据轴。
尝试backing up and then deleting您的偏好设置文件夹。您可能有一些损坏的设置。 (一个不太可能但可能的原因是字体\解释器问题......看起来你的字体与我的字体略有不同,效果很好,所以重置首选项可能对此有帮助。)
如果其中任何一项对你有用,请告诉我。