与文本函数相关的matlab缩放回调错误

与文本函数相关的matlab缩放回调错误,matlab,Matlab,在Matlab中尝试在缩放后回调函数中生成一系列文本框时,会产生大量错误,这些错误的痕迹对诊断和解决问题没有帮助。当文本生成在如下代码主体中时,代码正确执行,执行最小后期缩放回调函数没有问题: string='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; offset=8; h=figure; z=zoom(h); set(z,'ActionPostCallback',@post_callback); [ax,plt1,plt2]=plotyy(14:20,1:7,15:17,1:3

在Matlab中尝试在缩放后回调函数中生成一系列文本框时,会产生大量错误,这些错误的痕迹对诊断和解决问题没有帮助。当文本生成在如下代码主体中时,代码正确执行,执行最小后期缩放回调函数没有问题:

string='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
offset=8;
h=figure;
z=zoom(h);
set(z,'ActionPostCallback',@post_callback);
[ax,plt1,plt2]=plotyy(14:20,1:7,15:17,1:3,@bar,@bar)
ylim([0 10]);
hold on;
set(plt2,'FaceColor','r');
xLim=xlim(gca);
for i=xLim(1)+1:xLim(2)-1
    text(i,8,string(i-offset+1),'Clipping','on');
end



function post_callback(obj,evd)
    xLim = get(evd.Axes,'XLim');
但是,如果将文本框生成移动到
@post_callback
函数,则会导致一系列错误:

string='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
offset=8;
h=figure;
z=zoom(h);
set(z,'ActionPostCallback',@post_callback);
[ax,plt1,plt2]=plotyy(14:20,1:7,15:17,1:3,@bar,@bar)
ylim([0 10]);
hold on;
set(plt2,'FaceColor','r');



function post_callback(obj,evd)
xLim = get(evd.Axes,'XLim');
for i=xLim(1)+1:xLim(2)-1
    text(i,8,string(i-offset+1),'Clipping','on');
end
这些错误如下所述:


有人能告诉我错误的根本原因吗?

错误似乎是一样的。你应该试着在这里使用。在post回调函数中设置断点。但是,代码中存在一些问题。有些是实现问题,有些问题也不符合您的要求。您似乎有一些编程经验,所以我猜大多数实现问题只是bug。我将列出问题和解决方案

1) 当我看到你用字符串作为变量时,我哭了。String是一种抽象类型(现在在matlab中是obselete,因为更高版本使用
char
vectors)。改用其他名称,如
str
myString

2) 除非
offset
和变量
string
未声明为全局变量,否则它们将不在
post\u回调
的范围内。与C或C++不同,当在main中定义变量时,它不会变成全局变量(因为您甚至不定义一个main方法)。如果要在
post\u回调
中使用
string
offset
,则必须在其范围内(函数内)定义它们

3) 循环变量
i
不能是单元格。使用中的方法将其转换为双向量

4) 循环变量
i
必须是以下格式中的整数:

text(i,8,string(i-offset+1),'Clipping','on');
由于字符串定义为变量,变量索引必须是整数,
xLim
不需要是整数


5) 我认为
text
不会给出预期的输出。
text
所做的是创建一个字符串并将其链接到绘图上的一个点。这意味着每次缩放时,绘图中将有一个新文本。除非文本位于完全相同的位置(这可能是可能的,但需要大量工作),否则情节看起来会很难看。如果可能,按照示例1中的方式放置
文本
字符串,并将其从
post\u回调

(0)感谢您指出调试器。我不熟悉它,因为我大部分代码都是用
vi
编写的。(1) 当然,我永远不会在真正的脚本中调用变量
string
,在这里发布的示例代码中,我只是出于解释的目的使用了这个术语:)(2)关于变量的作用域,您提出了一个很好的观点。我假设默认情况下是全局作用域,因此我将作为参数传递给回调函数。(3) 关于
单元格
类型,我不认为我完全理解您对最后一个问题的回答中的这一点,因为我可以发誓我从
xlim
命令输出的结果。。。。。。was
double
而不是
cell
,但是当我返回到执行脚本的计算机时,我一定会再次检查这一点。我注意到在我的实际代码中,当限制很大时(例如,3.05*10^5),我不得不使用笨拙的类型转换,如
xLim=double(uint32(xLim(gca))
强制变量以非科学的符号格式为double(我想
sprintf
也可以)因为
循环迭代和字符串索引需要
int
double
,文本定位需要
double
类型。我觉得很奇怪,
xlim
命令会给出…@user001警告!对回调函数的输入进行修改。参数列表在MatlabGUI中预定义。相反,将它们作为字段添加到figure结构中。然后可以通过
set
get
功能读取和写入它们。关于(3),
xlim
的输出仅当有超过1个
轴时才是一个单元,这相当愚蠢,但matlab有时可能是这样。您需要一个
if-iscell(myXLim)
语句。(5) 如果您确实需要使用
text
,请确保文本字符串出现在正确的位置,并尝试在更改时删除句柄zoom@user001我指的是
文本
对象的句柄。@user001对不起,我指的当然是
句柄
参数。这应该是回调函数中的第三个参数。设置
text(i,8,string(i-offset+1),'Clipping','on');