В предыдущих релизах графические указатели являются числовыми указателями типа double. Начиная в R2014b, графические указатели являются указателями на объект различных типов, в зависимости от класса графического объекта. Графические объекты теперь ведут себя как другие объекты MATLAB®.
Большая часть кода, записанного для числовых указателей все еще, работает с указателями на объект. Например, можно получить доступ к свойствам графического объекта, и можно объединить графические объекты в массивы, даже если объекты принадлежат различным классам. Однако вы не должны выполнять операции, которые принимают или требуют, чтобы графические указатели были числовыми значениями, такими как:
Выполните арифметические операции на указателях
Используйте указатели непосредственно в логических операторах, не преобразовывая в логическое значение
Полагайтесь на числовые значения корневого объекта (0), или фигура обрабатывает (целые числа) в логических операторах
Объедините указатели с данными в числовых массивах
Используйте любую логику программы, которая зависит от указателей, являющихся числовым
Преобразование указателей на векторы символов или использование обрабатывает в операциях вектора символа
Существует два способа получить доступ к свойствам графических объектов, которые имеют указатели на объект:
Используйте запись через точку для ссылки на конкретный объект и свойство. Имена свойства являются чувствительными к регистру при использовании записи через точку. Например, это кодовые наборы Свойство цвета строки к 'красному'.
h = plot(1:10);
h.Color = 'red';Используйте set и функции get, чтобы получить доступ к свойствам для массива объектов. Например, это кодовые наборы свойство LineWidth для нескольких строк.
h = plot(rand(4));
set(h,'LineWidth',2);
При запуске в R2014b предварительно выделите массивы графических указателей с помощью функции gobjects вместо функции ones или zeros. Предварительное выделение с zeros или ones все еще запускается без ошибки, но может быть медленным.
Синтаксис для gobjects совпадает с синтаксисом для ones и zeros.
h = gobjects(3,1); % preallocate
h(1) = figure;
h(2) = plot(1:10);
h(3) = gca;
class(h)
ans = matlab.graphics.Graphics
При запуске в R2014b протестируйте законность графических указателей с помощью функции isgraphics вместо ishghandle.
x = 1:10; y = sin(x); p = plot(x,y); ax = gca; isgraphics([p,ax])
ans =
1 1 Начиная в R2014b, можно обратиться к фигуре или его указателем на объект или его целочисленным указателем. Целочисленный указатель является значением в новом свойстве Number фигуры.
h = figure; % object handle fignum = h.Number; % integer handle
fignum, является допустимым указателем фигуры.isgraphics(fignum) % test handle validityans =
1Начиная в R2014b, функция delete принимает только один входной параметр. Чтобы удалить несколько графических объектов, передайте единственный массив указателя функции, вместо того, чтобы использовать несколько аргументов.
h1 = annotation('line'); h2 = annotation('ellipse'); h3 = annotation('rectangle'); delete([h1,h2,h3])
Начиная в R2014b, вы не можете использовать графические указатели в логических выражениях или полагаться на MATLAB, чтобы возвратить ненулевое значение или пустой двойной []. Используйте функции, такие как isempty, isgraphics и isequal вместо этого.
Чтобы определить, существуют ли существующие фигуры, используйте isempty. Новая команда groot ссылается на корневой объект.
if ~isempty(get(groot,'CurrentFigure')) disp('There are existing figures.') else disp('There are no existing figures.') end
Чтобы определить, существуют ли графические объекты с определенным тегом, используйте isempty.
if ~isempty(findobj('Tag','myFigures')) disp('There are objects with this tag.') else disp('There are no objects with this tag.') end
Чтобы определить, является ли указатель допустимым указателем фигуры, используйте isgraphics и объект Type.
if isgraphics(h,'figure') disp('h is a valid figure handle.') else disp('h is not a valid figure handle.') end
Чтобы определить, является ли указатель корневым указателем, используйте новую команду groot.
if isequal(h,groot) disp('h is the root handle') else disp('h is not the root handle') end
Начиная в R2014b, вы не можете использовать cell2mat на массиве ячеек графических указателей, чтобы создать числовой массив. Создайте объектный массив из массива ячеек вместо этого.
p = plot(magic(3)); par = get(p,'Parent'); objarray = [par{:}]'; whos objarray
Name Size Bytes Class Attributes objarray 3x1 128 matlab.graphics.axis.Axes
При запуске в R2014b протестируйте равенство графических указателей с помощью == или isequal.
Чтобы определить, ссылаются ли указатели на тот же объект, поэтому, тот же указатель, использует ==.
p1 = plot(1:10); p2 = p1; p2 == p1
ans =
1Определить, относятся ли указатели к объектам того же класса с теми же значениями свойств, но являются не обязательно тем же объектом, isequal использования.
l1 = line; l2 = line; isequal(l1,l2)
ans =
1
Чтобы использовать cellfun и функции arrayfun, чтобы возвратить графические объекты, установите UniformOutput на false.
Например:
t = num2str(rand);
fh = @(t) text(1,1,t);
th = cellfun(fh,{t},'UniformOutput',false); При запуске в R2014b, если вы сохраняете графический объект в MAT-файле с помощью функции save, затем MAT-файл содержит всю информацию, запрошенную, чтобы регенерировать объект. В предыдущих релизах функция save хранит объект как двойное, и вы не можете регенерировать объект, когда вы загружаете MAT-файл.
Постарайтесь не сохранять фигуры с функцией save. Используя save, чтобы сохранить фигуру в R2014b или позже делает MAT-файл недоступным в более ранних версиях MATLAB. При использовании save, чтобы сохранить фигуру, то функция отображает предупреждающее сообщение. Сохраните фигуры, использующие функцию savefig вместо этого.
Если вы пишете файлы MEX или создаете приложения механизма, то mexGet и функции mexSet не работают на указателях графического объекта. Используйте mxGetProperty и функции mxSetProperty в Матричной Библиотеке C/C++ или Фортрана вместо этого.