2016-04-03 4 views
1

В прошлом я использовал Matlab 2013, и этот код работает правильно и никаких ошибок, но теперь я использую matlab r2015a, и когда я запускаю код, я получаю следующую ошибку: Cannot convert double value -10 to a handle. Я проверил сайт Matworks, но объяснение не очень понятно. Есть ли у вас какие-либо предложения о том, как это исправить? Спасибо огромное !Руководство Matlab r2015a - не может преобразовать double в ручку

function minhhoaxy(action,in1) 
 

 
global DATA; 
 

 
if nargin < 1, 
 
    action='start'; 
 
end; 
 

 
if strcmp(action,'start'), 
 
clf reset; 
 
figure(gcf); 
 
set(gcf,'Units','normalized','NumberTitle','off', ... 
 
     'Name','Minh hoa GUI','backingstore','on'); 
 
min_x=-10;  
 
max_x=10; 
 
x=0; 
 

 
uicontrol('Style','text','Units','normalized',... 
 
     'Position',[.03 .03 .1 .05],... 
 
     'BackgroundColor',[0 0.5 .5],... 
 
     'FontSize',12,'Fontname','VNI-Times',... 
 
     'ForegroundColor','white','String','Vò trí x:',... 
 
     'HorizontalAlignment','center'); 
 
uicontrol('Style','text','Units','normalized',... 
 
     'Position',[.15 .03 .05 .05],... 
 
     'BackgroundColor',[0 0 .5],... 
 
     'FontSize',12,'Fontname','VNI-Times',... 
 
     'HorizontalAlignment','center',... 
 
     'ForegroundColor','white','String',num2str(min_x)); 
 
x1=uicontrol('Style','slider','Units','normalized',... 
 
     'Position',[.2 .03 .25 .05],... 
 
     'SliderStep',[5.0000e-004 5.0000e-003],... 
 
     'Value',x,'Max',max_x,'Min',min_x,... 
 
     'Callback','minhhoaxy(''setx'',1);minhhoaxy(''redraw'');'); 
 
uicontrol('Style','text','Units','normalized',... 
 
     'Position',[.45 .03 .05 .05],... 
 
     'BackgroundColor',[0 0 .5],... 
 
     'FontSize',12,'Fontname','VNI-Times',... 
 
     'HorizontalAlignment','center',... 
 
     'ForegroundColor','white','String',num2str(max_x)); 
 
x2=uicontrol('Style','edit','Units','normalized',... 
 
     'Position',[.55 .03 .09 .05],... 
 
     'FontSize',10','Fontname','VNI-Times',... 
 
     'String',num2str(x),... 
 
     'Callback','minhhoaxy(''setx'',2);minhhoaxy(''redraw'')'); 
 
uicontrol('Style','text','Units','normalized',... 
 
     'Position',[.64 .03 .05 .05],... 
 
     'BackgroundColor',[0 0 .5],... 
 
     'FontSize',12,'Fontname','VNI-Times',... 
 
     'ForegroundColor','white','String','cm',... 
 
     'HorizontalAlignment','center'); 
 
uicontrol('Style','Pushbutton','Units','normalized',... 
 
     'Position',[.87 .03 .1 .05],... 
 
     'FontSize',12,'Fontname','VNI-Times',... 
 
     'Callback','minhhoaxy(''done'')','String','Thoaùt'); 
 
     
 
min_y=-10; 
 
max_y=10; 
 
y=0; 
 
uicontrol('Style','text','Units','normalized',... 
 
     'Position',[.03 .1 .1 .05],... 
 
     'BackgroundColor',[0 0.5 .5],... 
 
     'FontSize',12,'Fontname','VNI-Times',... 
 
     'ForegroundColor','white','String','Vò trí y:',... 
 
     'HorizontalAlignment','center'); 
 
uicontrol('Style','text','Units','normalized',... 
 
     'Position',[.15 .1 .05 .05],... 
 
     'BackgroundColor',[0 0 .5],... 
 
     'FontSize',12,'Fontname','VNI-Times',... 
 
     'HorizontalAlignment','center',... 
 
     'ForegroundColor','white','String',num2str(min_y)); 
 
uicontrol('Style','text','Units','normalized',... 
 
     'Position',[.45 .1 .05 .05],... 
 
     'BackgroundColor',[0 0 .5],... 
 
     'FontSize',12,'Fontname','VNI-Times',... 
 
     'HorizontalAlignment','center',... 
 
     'ForegroundColor','white','String',num2str(max_y)); 
 
uicontrol('Style','text','Units','normalized',... 
 
     'Position',[.64 .1 .05 .05],... 
 
     'BackgroundColor',[0 0 .5],... 
 
     'FontSize',12,'Fontname','VNI-Times',... 
 
     'ForegroundColor','white','String','cm',... 
 
     'HorizontalAlignment','center'); 
 
y1=uicontrol('Style','slider','Units','normalized',... 
 
     'Position',[.2 .1 .25 .05],... 
 
     'SliderStep',[5.0000e-004 5.0000e-003],... 
 
     'Value',y,'Max',max_y,'Min',min_y,... 
 
     'Callback','minhhoaxy(''sety'',1);minhhoaxy(''redraw'');'); 
 
y2=uicontrol('Style','edit','Units','normalized',... 
 
     'Position',[.55 .1 .09 .05],... 
 
     'FontSize',10','Fontname','VNI-Times',... 
 
     'String',num2str(y),... 
 
     'Callback','minhhoaxy(''sety'',2);minhhoaxy(''redraw'')'); 
 

 
     
 
dt=plot(x,y,'r.','EraseMode','xor','Markersize',50); 
 
axis([-10 10 -10 10]); 
 
grid; 
 
DATA=[x;min_x;max_x;x1;x2;dt;y;min_y;max_y;y1;y2]; 
 

 
elseif strcmp(action,'redraw'), 
 
    x=DATA(1); 
 
    dt=DATA(6); 
 
    set(DATA(5),'string',num2str(x));  
 
    set(DATA(4),'value',x); 
 
    y=DATA(7); 
 
    set(DATA(11),'string',num2str(y));  
 
    set(DATA(10),'value',y); 
 

 
    
 
    set(dt,'XData',x); 
 
    set(dt,'YDATA',y); 
 
    drawnow; 
 

 

 

 
elseif strcmp(action,'setx'), 
 
    if (in1==1), 
 
     DATA(1)=get(DATA(4),'value'); 
 
    else 
 
     min_x=DATA(2);  
 
     max_x=DATA(3); 
 
     x=str2double(get(DATA(5),'string')); 
 
     if (x>max_x), 
 
      x=max_x; 
 
     end; 
 
     if (x<min_x), 
 
      x=min_x; 
 
     end; 
 
     DATA(1)=x; 
 
    end 
 
    
 
elseif strcmp(action,'sety'), 
 
    if (in1==1), 
 
     DATA(7)=get(DATA(10),'value'); 
 
    else 
 
     min_y=DATA(8);  
 
     max_y=DATA(9); 
 
     y=str2double(get(DATA(11),'string')); 
 
     if (y>max_y), 
 
      y=max_y; 
 
     end; 
 
     if (y<min_y), 
 
      y=min_y; 
 
     end; 
 
     DATA(7)=y; 
 
    end  
 
    
 
elseif strcmp(action,'done'), 
 
    clf reset; 
 
    clear global DATA 
 
    close; 
 
end

+0

Опубликовать * полный * сообщение об ошибке. Кроме того, этот код ужасно запутан. Почему вы генерируете все свои объекты пользовательского интерфейса дважды? И не помещайте свои ручки в массив с другими случайными двойниками, а затем ссылайтесь на массив позже. Просто используйте ручки в своих вызовах 'set' или сохраните дескрипторы ваших объектов в своем * собственном * массиве с явными именами, чтобы вы знали, что используете, без необходимости возвращаться и ссылаться на свои назначения' DATA' каждый раз. – excaza

+0

Начиная с R2014b, [Графические ручки теперь являются объектами, а не парными] (http://www.mathworks.com/help/matlab/graphics_transition/graphics-handles-are-now-objects-not-doubles.html?refresh= правда). – excaza

+0

это полное сообщение об ошибке: «> В minhhoaxy (строка 96) Ошибки с помощью matlab.ui.control.UIControl/vertcat Невозможно преобразовать двойное значение от -10 до ручки Ошибки в minhhoaxy (строка 99) DATA = [x; min_x; max_x; x1; x2; dt; y; min_y; max_y; y1; y2]; '' –

ответ

1

Проблема связана с тем, что графика обрабатывает used to be doubles but are now objects. Из-за этого вы не можете создать массив, содержащий и цифры и графические дескрипторы (но вы могли это сделать). Если вы это сделаете, MATLAB попытается конвертировать между типами и сбой. Ваш вопрос на следующей строке

DATA = [x; min_x; max_x; x1; x2; dt; y; min_y; max_y; y1; y2]; 

dt в середине есть графический дескриптор объекта участка и вызывает ошибку, что вы видите.

dt = plot(x,y,'r.','EraseMode','xor','Markersize',50); 

Чтобы избежать этого, вам понадобится использовать другую структуру данных, чем числовой массив.

Лучшим способом обработки данных и графического дескриптора является использование struct или более понятного типа данных. Что-то вроде следующего.

DATA.x = x; 
DATA.y = y; 
DATA.dt = dt; 
... 

В противном случае вам нужно будет использовать массив клеток, которые могут содержать как объектов и номер:

DATA = {x; min_x; max_x; x1; x2; dt; y; min_y; max_y; y1; y2}; 
0

я имел такое же сообщение об ошибке в MATLAB 2016b, т.е. Cannot convert double value 1138.95 to a handle; для использования двойного массива с теоремой квадрата Фурье, в коде восстановления изображения. Это было решено простым вводом clear all в командной строке.

+1

Это действительно не прямой ответ, поскольку это просто означает, что у вас была переменная в вашей рабочей области, которая мешала с предполагаемым поведением. 'clear all' мог бы технически быть ответом для каждого вопроса MATLAB. – Suever

+0

Я обнаружил, что от четверти до трети всех моих сообщений об ошибках разрешается командой 'clear all'. –

+0

Правильно, это то же самое, что сказать, что выключение и повторное включение вашего компьютера устраняет большинство ваших проблем. – Suever

Смежные вопросы